Aero Snap не работает для моего приложения
У меня проблема с тем, что Aero Snap не работает с приложением, над которым я работаю (рабочий стол Windows, собственное приложение C++), и я немного озадачен тем, что происходит, так как кажется, что оно должно просто работать вне коробка.
Я использовал Spy++ в мини-приложении win32 и получаю следующие сообщения, когда нажимаю Win-Left:
<00070> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat:1 ScanCode:5B fRepeat: 0 fUp: 0 <00071> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN c Повтор:1 ScanCode:5B fNPN 0: 0NDN: 1: 0NDN: 1: 0NNNN: 5B FNPED: 1: 0NN: 0: FNNNN: 5NNNN: 5: FNDN: 0 VK_LWIN cRepeat:1 ScanCode:5B fRepeat: 1 fUp: 0 <00088> 00030D1C S WM_GETMINMAXINFO lpmmi: 0043FCBC
<00089> 00030D1C R WM_GETMINMAXINFO lpmmi: 0043FCBC
<00090> 00030D1C S WM_WINDOWPOSCHANGING lpwp: 0043FCC4
<00091> 00030D1C S WM_GETMINMAXINFO lpmmi: 0043F8E8
<00092> 00030D1C R WM_GETMINMAXINFO lpmmi: 0043F8E8
<00093> 00030D1C R WM_WINDOWPOSCHANGING
.. и так далее
Таким образом, я вижу, что WM_KEYDOWN для левой клавиши не достигает приложения, но вместо этого я получаю аэроснимки "изменить размер окна".
Когда я запускаю Spy++ мое приложение, я вижу, что левая клавиша не "перехватывается", а вместо этого передается приложению, так что я не получаю никаких щелчков.
<00043> 000F0F12 P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat:1 ScanCode:5B fRepeat: 0 fUp: 0
<00044> 000F0F12 P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat:1 ScanCode:5B fRepeat: 1 fUp: 0
<00045> 000F0F12 P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat:1 ScanCode:5B fRepeat: 1 fUp: 0
<00060> 000F0F12 P WM_KEYUP nVirtKey: VK_LEFT cRepeat: 1 ScanCode: 4B fRepeat: 0 fUp: 1
Я собираюсь углубиться в основы нашей обработки сообщений и посмотреть, что происходит, но я приму все советы, которые смогу получить:)
Редактировать Я заметил, что Win-Up и Win-Shift-Left/Right на самом деле работают правильно, поэтому просто Win-Down и Win-Left/Right не "привязываются" в правильной позиции / размере.
Правка Хорошо, проблема в том, что мое окно не было создано с флагом WS_THICKFRAME. Если я добавлю флаг, оснастка работает. Сейчас я на самом деле не хочу, чтобы там была граница, но, по крайней мере, я знаю, что вызвало странное поведение...
Надеюсь, окончательное редактирование Избавиться от границы было так же просто, как ответить на WM_NCCALCSIZE и заставить клиента занимать все окно.
2 ответа
Я не могу вспомнить конкретные сообщения, но функция Aero Snap отключена, если вы обрабатываете сообщения WM_MOVING/WM_MOVE и / или WM_SIZING/WM_SIZE для главного окна. Если они не достигают DefWindowProc
Aero Snap не будет работать. Я предполагаю, что DefWindowProc отвечает за реализацию Aero Snap, поэтому, если вы убедитесь, что эти сообщения достигают его, это может помочь.
Я обнаружил, что это реализует пользовательский код перетаскивания окон, поэтому приложение продолжает выполнять и обновлять экран, пока перетаскивается окно, что означало обработку этих сообщений, но отключило Aero Snap.
Изменить: При дальнейшей проверке, приложение, которое я упомянул, обрабатывает WM_SYSCOMMAND и проверяет (wParam & 0xFFF0) == SC_MOVE
для обозначения начала перемещения окна. Затем он возвращает 0 и имитирует перетаскивание окна, периодически обновляя положение окна, пока еще выполняется приложение, рисует и т. Д. Это заставляет Windows думать, что окно неподвижно, и что пользователь не может его перетащить, но мое приложение обновляет позицию, чтобы сделать похоже, что он все еще перетаскивается до WM_LBUTTONUP. Очевидно, что Windows не будет пытаться использовать Aero Snap, если не думает, что окно перетаскивается. Может быть, ваше приложение делает что-то подобное (если у кого-то есть лучший способ сохранить приложение во время перетаскивания, мне было бы интересно услышать).
Я сомневаюсь, что это обработка сообщений, цикл сообщений никогда не видит сообщение WM_KEYDOWN. После неудачных попыток по-разному в Windows я могу только догадываться, что ваше приложение каким-то образом несовместимо. Использование SetWindowsHookEx() в вашей программе, например.