2010-05-27 2 views
7

У меня проблема с 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, и заставить клиента занять все окно.

+0

Вы можете оставить свой код для работы с NCCALCSIZE? –

+2

Код был таким же простым, как возврат 0 из обработчика сообщений. См. Документацию MSDN для WM_NCCALCSIZE для подробного описания того, что на самом деле происходит, но, короче говоря, когда NCCALCSIZE вызывается, lParam содержит указатель на массив из трех прямоугольников, где первый - это прямоугольник окна. Когда вы вернетесь из NCCALCSIZE, Windows ожидает, что первый прямоугольник будет вашим прямым клиентом, поэтому, просто не делая ничего, вы заставили клиента прямо равным окну rect. –

+0

Моя ситуация для максимально развернутого окна. Поэтому я включил WS_THICKFRAME, я отключил WS_CAPTION (потому что я рисую свой собственный), и я возвращаю 0 для WM_NCCALCSIZE в моем windowproc, но я все еще вижу границу. : p –

ответ

4

Я не могу вспомнить конкретные сообщения, но 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

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

Смежные вопросы