Me preguntaba cuál es la diferencia entre los mensajes WM_QUIT, WM_CLOSE y WM_DESTROY en un programa de Windows, esencialmente: cuándo se envían y si tienen algún efecto automático además de lo que define el programa.¿Cuál es la diferencia entre WM_QUIT, WM_CLOSE y WM_DESTROY en un programa de Windows?
Respuesta
Son totalmente diferentes.
WM_CLOSE
se envía a la ventana cuando se presiona "X" o se elige "Cerrar" en el menú de la ventana. Si captas este mensaje, esta es tu decisión sobre cómo tratarlo: ignóralo o cierra la ventana. De forma predeterminada, WM_CLOSE
pasó a DefWindowProc
provoca la destrucción de la ventana. Cuando se destruye la ventana, se envía el mensaje WM_DESTROY
. En esta etapa, en oposición al WM_CLOSE
, no puede detener el proceso; solo puede realizar una limpieza necesaria. Pero recuerde que cuando detecta WM_DESTROY
justo antes de que todas las ventanas secundarias ya estén destruidas. WM_NCDESTROY
se envía justo después de que se hayan destruido todas las ventanas hijas.
WM_QUIT
mensaje no está relacionado con ninguna ventana (el hwnd
obtenido de GetMessage
es NULL y no se llama a ningún procedimiento de ventana). Este mensaje indica que el ciclo de mensajes debe detenerse y la aplicación debe cerrarse. Cuando GetMessage
lee WM_QUIT
, devuelve 0 para indicar eso. Eche un vistazo a typical message loop snippet - el ciclo continúa mientras GetMessage
devuelve un valor distinto de cero. WM_QUIT
se puede enviar por la función PostQuitMessage
. Esta función se suele llamar cuando la ventana principal recibe WM_DESTROY
(consulte typical window procedure snippet).
Primero analicemos WM_QUIT - la diferencia de otros mensajes que esto no está asociado con la ventana. Es utilizado por la aplicación. Por ejemplo, esto puede ser manejado por un servidor OLE independiente no visible (.exe, pero no en el proceso como .dll)
WM_CLOSE - por msdn: "Una aplicación puede solicitar confirmación al usuario, antes de destruir un ventana "- se usa como notificación sobre la intención de cerrar (puede rechazar esta intención).
WM_DESTROY - es un hecho que la ventana se está cerrando y todos los recursos deben (!) Ser desasignados.
En primer lugar, los mensajes WM_CLOSE y WM_DESTROY están asociados con las ventanas particulares mientras que el mensaje WM_QUIT es aplicable a toda la aplicación (así rosca) y el mensaje no se recibe a través de un procedimiento de ventana (WndProc
rutina), pero sólo a través las funciones GetMessage
o PeekMessage
.
En su rutina WndProc
, la función DefWindowProc
se ocupa del comportamiento predeterminado de estos mensajes. Los mensajes WM_CLOSE solicitan que la aplicación se cierre y el comportamiento predeterminado para esto es llamar a la función DestroyWindow
. Es cuando se llama a esta función DestroyWindow
que se envía el mensaje WM_DESTROY. Tenga en cuenta que el WM_CLOSE es solo un mensaje que le solicita que cierre (como WM_QUIT); en realidad, no tiene que salir/salir. Pero el mensaje WM_DESTROY le dice que su ventana de ES estando cerrado y destruyeron por lo que debe limpiar cualquier recurso, etc maneja
No para toda la aplicación, sino para un bucle de mensaje en particular. Cada subproceso puede tener su propio bucle de mensaje, por lo que una aplicación puede tener varios bucles de mensajes. – 0xC0000022L
Sólo por lo que no se pierde en los comentarios ... no se olvide de WM_CANCEL
. Cuando hace clic en el botón Cerrar (x) en un cuadro de diálogo MFC, ciertamente enviará WM_CLOSE
.La función predeterminada OnClose()
llamará a la función predeterminada (clase base) OnCancel()
.
Sin embargo, si sólo hay que escribir la clave ESC
, esto dará lugar a la clausura del diálogo, pero (por lo que puedo decir) sin generar el evento WM_CLOSE
- que va directamente al mecanismo WM_CANCEL/OnCancel()
.
Por la presente invito a la comunidad a profundizar en esto ... o edite esa elaboración en la respuesta aceptada.
- 1. ¿Cuál es la diferencia entre un programa de procedimiento y un programa orientado a objetos?
- 2. ¿Cuál es la diferencia entre _chdir y SetCurrentDirectory en Windows?
- 3. ¿Cuál es la diferencia entre GTK # y Windows Forms?
- 4. ¿Diferencia entre un script y un programa?
- 5. ¿Cuál es la diferencia entre strtok_r y strtok_s en C?
- 6. ¿Cuál es la diferencia entre dict() y {}?
- 7. Cuál es la diferencia entre = y: =
- 8. ¿Cuál es la diferencia entre ".equals" y "=="?
- 9. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 10. ¿Cuál es la diferencia entre .ToString (+) y ""
- 11. ¿cuál es la diferencia entre:.! y: r !?
- 12. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 13. ¿Cuál es la diferencia entre + = y = +?
- 14. Cuál es la diferencia entre $ y jQuery
- 15. Cuál es la diferencia entre $ (...) y `...`
- 16. ¿Cuál es la diferencia entre @ y @@ en un módulo?
- 17. ¿Cuál es la diferencia entre. y # en un archivo css?
- 18. ¿Cuál es la diferencia entre {0} y ""?
- 19. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 20. ¿Cuál es la diferencia entre " " y ""?
- 21. ¿Cuál es la diferencia entre un ayudante y un parcial?
- 22. ¿Cuál es la diferencia entre un JavaBean y un POJO?
- 23. ¿Cuál es la diferencia entre un vector y un vértice?
- 24. ¿Cuál es la diferencia entre un controlador y un servicio?
- 25. ¿Cuál es la diferencia entre un árbol y un directorio?
- 26. ¿Cuál es la diferencia entre un predicado y un funcionador?
- 27. ¿Cuál es la diferencia entre un método y un selector?
- 28. ¿Cuál es la diferencia entre un IORef y un MVar?
- 29. ¿Cuál es la diferencia entre un algoritmo y un método
- 30. ¿Cuál es la diferencia entre un "nonce" y un "GUID"?
Gran respuesta, pero mirando el código del bucle de mensajes, el bucle continúa mientras 'GetMessage' devuelve un valor distinto de cero, no hasta, a menos que me falta algo. –
Sí, por supuesto, corregido. – adf88
@ ad88 sería genial agregar lo que sucede cuando llega el inicio de sesión de usuario/'WM_ENDSESSION'. ¿Esto activa automáticamente WM_CLOSE/QUIT/DESTROY? – Basj