Событие изменения размера окна не срабатывает при привязке окна к краю экрана с помощью мыши

этот вопрос по отношению к этот вопрос переполнения стека, но я чувствовал, что проблема в сердце меньше о программировании и больше об ограничениях программы, поэтому я спрашиваю здесь.

Я надеюсь, что кто-то сможет объяснить расхождения, которые я вижу с Windows Snap при использовании события изменения размера окна в качестве триггера для некоторого кода VBA.

у меня есть этот код ThisWorkbook модуль. Он добавляет 1 к значение A1 на первом листе при каждом изменении размера окна:

Private Sub Workbook_WindowResize(ByVal Wn As Window)
Dim n As Integer

n = ThisWorkbook.Worksheets(1).Range("a1").Value
ThisWorkbook.Worksheets(1).Range("a1").Value = n + 1

End Sub

событие будет срабатывающие при:

  • окно развернуто или свернуто
  • окно изменяется путем перетаскивания краев внутрь / наружу
  • окно привязывается в сторону, нажав Windows + стрелка на клавиатуре
  • окно(a) защелкивается в сторону в результате привязки другого окна (b) в одну сторону и затем выберите первое окно(a) из эскизов Windows Snap Assist

событие не будет срабатывающие при:

  • окно привязывается к стороне, перетаскивая окно к краю экрана с помощью мыши
  • окно unsnapped от стороны, перетаскивая окно с помощью мыши

что я пробовал

Я проверил Примечание дополнительные сведения об ограничениях события изменения размера Windows. Как вы можете видеть из этой ссылки, недостаточно информации, чтобы быть полезной в этой ситуации.

Я также проверил Stack Overflow и Super User и не нашел никаких других вопросов, упоминающих использование Windows Snap в качестве триггера для макроса, кроме того, о котором говорилось в начале моего вопроса.


изменить: я тоже пробовал Application_WindowResize, который дает тот же результат.

я использовал этот код в ThisWorkbook модуль для инициализации событий приложения:

Private WithEvents App As Application

Private Sub Workbook_Open()
    Set App = Application
End Sub

и этот код после закрытия и повторного открытия книги, чтобы проверить триггер событие:

Private Sub App_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
Dim n As Integer

n = ThisWorkbook.Worksheets(1).Range("a1").Value
ThisWorkbook.Worksheets(1).Range("a1").Value = n + 1

End Sub

для уточнения, этот код выполняется в новой книге, более ранний код отсутствует в VBE. Я вижу тот же результат, что и выше, событие срабатывает для всего, кроме перетаскивания и привязки к краю экрана с помощью мыши.


может ли кто-нибудь сказать мне, почему событие изменения размера Windows не срабатывает для случаев выше?

15
задан girlvsdata
05.05.2023 1:20 Количество просмотров материала 2686
Распечатать страницу

1 ответ

событие resize был всегда с шелушащейся в Excel, а лучше не стало в последних версиях. Он никогда не работал полностью в некоторых случаях, связанных с развернутые или свернутые окна и, по-видимому, привязка использует аналогичный механизм.

разрешать проблему требует поэтому взаимодействовать сразу с Windows API и перехвата сообщений Windows, связанных с изменением размера.

метод 1: Создание нового насоса сообщений для применение

вы найдете весь код VB в последней записи на Джаафар Tribak поста обнаружение изменения размера окна приложения Excel.

в двух словах, вам нужно объявить функции API Windows FindWindow и SetWindowLong и использовать их для поиска окна приложения, по имени XLMAIN, и установите ваш собственный насос сообщения. Затем вы перехватываете соответствующие сообщения Windows и обрабатываете их, и, наконец, передать их на окна. Весь код слишком длинный, чтобы воспроизвести его здесь и адаптировать его к вашим потребностям потребуется некоторое знание VB и Windows API.

Способ 2: Используйте Библиотеки DLL C

для 32-разрядных версий Excel можно использовать библиотеку DLL C (Библиотека Динамической Нагрузки)SubCls.dll и модуля код modSubCls.bas скачать с этот сайт.

описание того, как их использовать, можно найти в посте обнаружение события изменения размера окна.

I в заключение отметим, что я не знаю простого решения этой проблемы. Я боюсь, что вам нужно будет сделать некоторые тяжелые программирования, чтобы обойти эти недостатки в Excel.

1
отвечен harrymc 2023-05-06 09:08

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх