How to simulate Windows shutdown for debugging?

后端 未结 4 1939
北恋
北恋 2020-12-04 16:54

I have an issue with my application when Windows shuts down - my app isn\'t exiting nicely, resulting in the End Task window being displayed. How can I use the debugger to s

相关标签:
4条回答
  • 2020-12-04 16:59

    SendMessage can be used to send window messages with any parameters to a window.

    Very useful for debugging and testing.

    1. Send the message WM_QUERYENDSESSION with LPARAM = ENDSESSION_CLOSEAPP. The application must return 1 (TRUE) to indicate it's prepared to shut down and restart.

    2. Send the message WM_ENDSESSION with LPARAM = ENDSESSION_CLOSEAPP The application must shut down within the specified timeout period.

    0 讨论(0)
  • 2020-12-04 17:04

    There is a tool named Restart Manager (rmtool.exe) in the Microsoft's Logo Testing Tools for Windows, which can be used to send shutdown and restart messages to a process. Logo testing tools can be downloaded here:

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

    Then you can simulate shutdown for your process:

    rmtool.exe -p [PID] -S
    

    where [PID] is the process ID. According to the Vista Logo Certification Test Cases document,

    Restart Manager shutdown messages are:

    a. WM_QUERYENDSESSION with LPARAM = ENDSESSION_CLOSEAPP(0x1): GUI applications must respond (TRUE) immediately to prepare for a restart.

    b. WM_ENDSESSION with LPARAM = ENDSESSION_CLOSEAPP(0x1): The application must shutdown within 5 seconds (20 seconds for services).

    c. CTRL_SHUTDOWN_EVENT: Console applications must shutdown immediately.

    0 讨论(0)
  • 2020-12-04 17:14

    I believe when Windows is shutting down it sends a "WM_QueryEndSession" to all applications. To simulate a Windows shutdown you could create a little application that just does a PostMessage with this message to your application and see what happens. Windows may send more messages than that to actually close your application (like WM_CLOSE), but whenever your application receives the "WM_QueryEndSession" message it means your application is about to have the rug pulled out from under it.

    0 讨论(0)
  • 2020-12-04 17:22

    You could use the SystemEvents.SessionEnding event, which is fired when a user logs off or shuts down. Be careful when using it though, some resources are not guaranteed to be available. For example, my application needed to hit a server when it was shutting down to clock a user out (a timeclock application), but the network card is sometimes already disabled when this event occurs. Since you're just doing cleanup, this should work fine.

    0 讨论(0)
提交回复
热议问题