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.
Podría publicar su código para el manejo de NCCALCSIZE? –
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. –
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 –