2010-05-27 12 views
7

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 sobre lo que está sucediendo, ya que parece que debería funcionar, de fábrica.Aero Snap no funciona para mi aplicación

He usado Spy ++ en una aplicación Win32 mininal, y obtener los siguientes mensajes al pulsar Win-Izquierda:

< 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í sucesivamente

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

Cuando exploto mi aplicación, 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

I Voy a profundizar en el núcleo de nuestro manejo de mensajes y ver qué está pasando, pero tomaré toda la información s Puedo obtener :)

Editar Me di cuenta de que Win-Up y Win-Shift-Left/Right en realidad funcionan correctamente, por lo que es Win-Down y Win-Left/Right que no están siendo "aero ajustado "en la posición/tamaño correcto.

Editar Bien, el problema parece ser que mi ventana no se creó con el indicador WS_THICKFRAME. Si agrego el indicador, el complemento funciona. Ahora, yo en realidad no quiero la frontera allí en primer lugar, pero por lo menos sé lo que estaba causando el comportamiento extraño ..

de esperar una edición final Deshacerse de la frontera era tan simple como respuesta a las WM_NCCALCSIZE, y hacer que el cliente ocupe toda la ventana.

+0

Podría publicar su código para el manejo de NCCALCSIZE? –

+2

El código era tan simple como devolver 0 desde el manejador de mensajes. Consulte la documentación de MSDN para WM_NCCALCSIZE para obtener una descripción detallada de lo que realmente está sucediendo, pero en resumen, cuando se llama a NCCALCSIZE, lParam contiene un puntero a una matriz de 3 rectángulos, donde el primero es la ventana rect. Cuando regrese de NCCALCSIZE, Windows espera que el primer rectángulo para ser su rect cliente, por lo que simplemente no hacer nada, que haya realizado los rect cliente sea igual al rect ventana. –

+0

Mi situación es para una ventana maximizada. Así que he activado WS_THICKFRAME, he desactivado WS_CAPTION (porque estoy dibujando el mío), y estoy devolviendo 0 para WM_NCCALCSIZE en mi ventana, pero aún veo el borde. : p –

Respuesta

4

No puedo recordar los mensajes específicos, pero Aero Snap se desactiva si se procesan los mensajes WM_MOVE WM_MOVING/y/o WM_SIZING/WM_SIZE de la ventana principal. Si estos no llegan al 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í esta ventana personalizada implementar arrastrando código para la aplicación continúa a ejecutar y actualizar la pantalla, mientras que la ventana se arrastra, lo que significaba el procesamiento de estos mensajes, pero desactivado Aero Snap.

Editar: En una inspección adicional, la aplicación que mencioné maneja WM_SYSCOMMAND y comprueba (wParam & 0xFFF0) == SC_MOVE para indicar un inicio de movimiento de ventana. A continuación, devuelve 0 y simula el arrastre de las ventanas mediante la actualización de la posición de la ventana periódicamente, mientras que todavía se ejecuta la aplicación, dibujo, etc. Esto hace que Windows piensa que la ventana es inamovible y que el usuario no puede arrastrarla, pero mi solicitud es la actualización de 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).

2

dudo que es el manejo de mensajes, el bucle de mensajes 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.

Cuestiones relacionadas