c++ winapi windows-7 aero aero-snap

c++ - Aero Snap no funciona para mi aplicación



winapi windows-7 (2)

Tengo un problema con Aero Snap que no funciona con la aplicación en la que estoy trabajando (escritorio de Windows, aplicación C ++ nativa), y estoy un poco confundido en cuanto a lo que está sucediendo, ya que parece que debería funcionar, fuera de la caja.

He usado Spy ++ en una aplicación win32 mínima y recibo los siguientes mensajes cuando presiono 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
.. y así

Así que puedo ver que la WM_KEYDOWN de la tecla izquierda no está llegando a la aplicación, pero en su lugar obtengo el ajuste de ajuste de "Ajustar ventana".

Cuando veo mi aplicación en Spy ++, puedo ver que la tecla izquierda no está siendo "interceptada", sino que se transfiere a la aplicación, por lo que no obtengo ninguna bondad.

<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

Voy a profundizar en el núcleo de nuestro manejo de mensajes y ver qué está pasando, pero tomaré todos los consejos que pueda obtener :)

Editar Noté que Win-Up y Win-Shift-Left / Right en realidad funcionan correctamente, por lo que solo se trata de Win-Down y Win-Left / Right que no están siendo "ajustados por aire" en la posición / tamaño correcto.

Edite Ok, el problema parece ser que mi ventana no se creó con el indicador WS_THICKFRAME. Si agrego el indicador, el complemento funciona. Ahora, en realidad, no quiero el borde allí en primer lugar, pero al menos sé lo que estaba causando el comportamiento extraño.

Esperemos que una edición final Deshacerse de la frontera sea tan simple como responder a WM_NCCALCSIZE, y hacer que el cliente ocupe toda la ventana.


Dudo que sea el manejo de mensajes, el bucle de mensaje nunca ve el mensaje WM_KEYDOWN. Después de probar varias cosas sin éxito, solo puedo adivinar a Windows pensando que tu aplicación es incompatible de alguna manera. Usando SetWindowsHookEx () en su programa, por ejemplo.


No recuerdo los mensajes específicos, pero Aero Snap está deshabilitado si procesa los mensajes WM_MOVING / WM_MOVE y / o WM_SIZING / WM_SIZE para la ventana principal. Si estos no llegan a DefWindowProc Aero Snap no funcionará. Supongo que DefWindowProc es responsable de implementar Aero Snap, por lo que si se asegura de que esos mensajes lleguen a él, podría ser útil.

Descubrí que implementar código de arrastre de la ventana personalizada para que la aplicación continúe ejecutando y actualizando la pantalla mientras se arrastra la ventana, lo que significaba procesar estos mensajes, pero deshabilitaba el ajuste de Aero.

Editar: En una inspección posterior, la aplicación que mencioné maneja WM_SYSCOMMAND y comprueba (wParam & 0xFFF0) == SC_MOVE para indicar el inicio de un movimiento de ventana. A continuación, devuelve 0 y simula la ventana arrastrando al actualizar la posición de la ventana periódicamente mientras ejecuta la aplicación, el dibujo, etc. Esto hace que Windows piense que la ventana no se puede mover y que el usuario no puede arrastrarla, pero mi aplicación está actualizando la posición para hacer parece que todavía está siendo arrastrado, hasta que WM_LBUTTONUP. Obviamente, Windows no probará nada de Aero Snap si no cree que la ventana está siendo arrastrada. Tal vez su aplicación haga algo similar (si alguien tiene una mejor manera de mantener la aplicación en ejecución durante un arrastre, me gustaría saber).