2009-02-06 19 views
45

Tengo un problema con mi aplicación cuando se cierra Windows: mi aplicación no sale muy bien, lo que da como resultado que se muestre la ventana Finalizar tarea. ¿Cómo puedo usar el depurador para ver qué está pasando?¿Cómo simular el apagado de Windows para la depuración?

¿Hay alguna manera de enviar los mensajes de cierre de Windows a mi aplicación para que piense que Windows se está cerrando, para que pueda ver exactamente cómo se comporta?

Respuesta

58

Hay una herramienta llamada Restart Manager (rmtool.exe) en las herramientas de prueba de Logo de Microsoft para Windows, que se puede utilizar para enviar y reiniciar mensajes a un proceso. herramientas de prueba de logotipo se puede descargar aquí:

http://download.microsoft.com/download/d/2/5/d2522ce4-a441-459d-8302-be8f3321823c/LogoToolsv1.0.msi

A continuación, se puede simular de conclusión de su proceso:

rmtool.exe -p [PID] -S 

donde [PID] es el ID del proceso. De acuerdo con el documento Casos de prueba Certificación del logotipo de Vista,

Mensajes de cierre Reiniciar el Gestor son:

a. WM_QUERYENDSESSION con LPARAM = ENDSESSION_CLOSEAPP (0x1): las aplicaciones de GUI deben responder (TRUE) inmediatamente para prepararse para un reinicio.

b. WM_ENDSESSION con LPARAM = ENDSESSION_CLOSEAPP (0x1): la aplicación debe cerrarse en 5 segundos (20 segundos para los servicios).

c. CTRL_SHUTDOWN_EVENT: las aplicaciones de consola deben cerrarse inmediatamente.

+0

¡increíble! (Todavía no lo he probado, si alguien lo usa y puede proporcionar comentarios que serían geniales) – Rory

+2

Tu enlace está roto. Las herramientas de prueba de logotipo formaban parte del antiguo programa de logotipo de software de cliente de Windows 7. Las herramientas ya no están en el sitio web de Microsoft. Las herramientas parecen haber sido reemplazadas por el Windows App Certification Kit, que es parte del Programa de certificación de aplicaciones de escritorio de Windows 10. El kit no incluye 'rmtool.exe', solo' rmlogotest.exe'. He escrito un poco sobre 'rmlogotest.exe' en otro lugar; para leer lo que he escrito, sigue [este enlace] (http://superuser.com/questions/959364/on-windows-how-can-i-gracefully-ask-a-running-program-to-terminate# 1154058). – unforgettableid

+0

'rmlogotest.exe' envía algunos mensajes a su aplicación, y sospecho que son los mismos mensajes que' rmtool.exe' solía enviar, pero no he verificado para estar seguro. – unforgettableid

6

Creo que cuando se cierra Windows, envía una "WM_QueryEndSession" a todas las aplicaciones. Para simular un cierre de Windows, podría crear una pequeña aplicación que solo haga un PostMessage con este mensaje para su aplicación y ver qué sucede. Windows puede enviar más mensajes que eso para cerrar su aplicación (como WM_CLOSE), pero cada vez que su aplicación recibe el mensaje "WM_QueryEndSession" significa que su aplicación está a punto de sacar el tapete de debajo.

+1

WM_QueryEndSession es seguido (dado el todo OK por las aplicaciones que lo reciben) por WM_EndSession. – JMD

+0

Excelente - gracias por la aclaración JMD. Pensé que tenía que haber un mensaje adicional, pero no estaba seguro de qué se trataba. –

+0

¿Algun utilidades útiles que pueda usar para enviar tales mensajes en lugar de crear uno yo mismo? – Rory

0

Puede usar el evento SystemEvents.SessionEnding, que se activa cuando un usuario cierra la sesión o se cierra. Sin embargo, tenga cuidado al usarlo; algunos recursos no están garantizados para estar disponibles. Por ejemplo, mi aplicación necesitaba conectarse a un servidor cuando se estaba apagando para desconectar a un usuario (una aplicación de reloj horario), pero a veces la tarjeta de red ya está deshabilitada cuando ocurre este evento. Como solo está haciendo la limpieza, esto debería funcionar bien.

+0

¿cómo puedes simular el apagado para probar lo que escribiste? – KansaiRobot

0

SendMessage se puede utilizar para enviar mensajes de ventana con cualquier parámetro a una ventana.

Muy útil para la depuración y la prueba.

  1. enviar el mensaje WM_QUERYENDSESSION con LPARAM = ENDSESSION_CLOSEAPP. La aplicación debe devolver 1 (VERDADERO) para indicar que está preparado para apagar y reiniciar.

  2. enviar el mensaje WM_ENDSESSION con LPARAM = ENDSESSION_CLOSEAPP La aplicación debe cerrar dentro del período de tiempo especificado.

Cuestiones relacionadas