У меня проблема с Aero Snap, не работающим с приложением, над которым я работаю (рабочий стол Windows, собственное приложение на C++), и я немного смущен относительно того, что происходит, поскольку это похоже, он должен просто работать, из коробки.Aero Snap не работает для моего приложения
Я использовал Spy ++ на mininal приложения win32, и получить следующие сообщения при нажатии Win-Left:
< 00070> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 скан: 5В fRepeat: 0 FUP : 0 < 00071> 00030D1C Р WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 1 FUP: 0 < 00072> 00030D1C Р 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: 0043FCC < 00091> 00030D1C S WM_GETMINMAXINFO lpmmi: 0043F8E8
< 00092> 00030D1C R WM_GETMINMAXINFO lpmmi: 0043F8E8
< 00093> 00030D1C R WM_WINDOWPOSCHANGING
.. и так далее
Итак, я вижу, что WM_KEYDOWN для левого ключа не доходит до приложения, но вместо этого я получаю аэробную привязку «изменить размер окна».
Когда I Spy ++ мое приложение, я вижу, что левая клавиша не «перехвачена», а вместо этого передается в приложение, поэтому я не получаю никакого хватания.
< 00043> 000F0F12 Р WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 0 FUP: 0
< 00044> 000F0F12 Р WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 1 FUP: 0
< 00045> 000F0F12 Р WM_KEYDOWN nVirtKey: VK_LWIN cRepeat: 1 Scancode: 5B fRepeat: 1 FUP: 0
< 00060> 000F0F12 Р WM_KEYUP nVirtKey: VK_LEFT cRepeat: 1 Scancode: 4B fRepeat: 0 FUP: 1
Я я собираюсь копаться в ядрах обработки сообщений и видеть, что происходит, но я возьму все советы s я могу получить :)
Редактировать Я заметил, что Win-Up и Win-Shift-Left/Right на самом деле работают правильно, так что это просто Win-Down и Win-Left/Right, которые не являются «aero щелкнули "в правильное положение/размер.
Редактировать Хорошо, проблема в том, что мое окно не было создано с помощью флага WS_THICKFRAME. Если я добавлю флаг, защелкните работы. Теперь я вообще не хочу границы там, но, по крайней мере, я знаю, что вызывало странное поведение.
Надеюсь, окончательное изменение Избавление от границы было так же просто, как ответить на WM_NCCALCSIZE, и заставить клиента занять все окно.
Вы можете оставить свой код для работы с NCCALCSIZE? –
Код был таким же простым, как возврат 0 из обработчика сообщений. См. Документацию MSDN для WM_NCCALCSIZE для подробного описания того, что на самом деле происходит, но, короче говоря, когда NCCALCSIZE вызывается, lParam содержит указатель на массив из трех прямоугольников, где первый - это прямоугольник окна. Когда вы вернетесь из NCCALCSIZE, Windows ожидает, что первый прямоугольник будет вашим прямым клиентом, поэтому, просто не делая ничего, вы заставили клиента прямо равным окну rect. –
Моя ситуация для максимально развернутого окна. Поэтому я включил WS_THICKFRAME, я отключил WS_CAPTION (потому что я рисую свой собственный), и я возвращаю 0 для WM_NCCALCSIZE в моем windowproc, но я все еще вижу границу. : p –