Aero Snap не работает для моего приложения - PullRequest
7 голосов
/ 27 мая 2010

У меня проблема с тем, что 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 cRepeat: 1 ScanCode: 5B fRepeat: 1 fUp: 0 <00072> 00030D1C P WM_KEYDOWN nVirtKey: 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 ]

4 голосов
/ 27 мая 2010

Я не могу вспомнить конкретные сообщения, но функция 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, если не считает, что окно перетаскивается. Возможно, ваше приложение делает что-то подобное (если у кого-то есть лучший способ сохранить приложение во время перетаскивания, мне было бы интересно услышать).

2 голосов
/ 27 мая 2010

Я сомневаюсь, что это обработка сообщений, цикл сообщений никогда не видит сообщение WM_KEYDOWN. После неудачных попыток по-разному в Windows я могу только догадываться, что ваше приложение каким-то образом несовместимо. Например, используя SetWindowsHookEx () в вашей программе.

...