如何处理您的 windows 应用程序被强制关闭?
how to handle your windows application being force closed?
如果用户决定强制关闭我的应用程序(比如通过任务管理器),有没有一种方法可以让我在应用程序关闭之前快速执行一些清理代码?我正在用 c++ 编码 btw
如果您使用的是消息泵,请处理 WM_QUIT
消息。
另外:What is the difference between WM_QUIT, WM_CLOSE, and WM_DESTROY in a windows program?
编辑
抱歉,我读到了您想处理终止的事实,例如通过任务管理器。
不过,这可能对您有所帮助:How to catch event when Task manager kill your C++ application
这取决于指示进程如何关闭。可以在正常退出时执行此操作,但不能强制关闭任何内容。
如果进程通过 TerminateProcess
or ExitProcess
, you won't be able to perform any graceful cleanup. TerminateProcess
is how Task Manager and utilities like Sysinternals pskill end a target process. ExitProcess
关闭,则在进程内调用,但通常不用于退出。
如果进程在一个线程(通常是进程中的第一个线程)上有消息泵并且没有其他线程运行是运行代码,其生命周期独立于activity 在该线程中,然后 WM_QUIT
message will signal that the process should close (semantically, that the app should close, your process might conceivably stick around for a while for other reasons), and you can run cleanup code upon receiving the message. Depending on your needs, in a windowed app you might consider performing cleanup operations as early as WM_CLOSE
or WM_DESTROY
.
如果您在 DLL 中编写了代码,您可以在 DllMain
中处理通知,这将允许您执行最后机会清理 (DLL_PROCESS_DETACH
),这可能涵盖进程退出而没有消息泵的情况。但是,这不是对严格依赖任何 C/C++ 运行时(或任何其他 DLL)的代码执行清理的好方法,因为运行时可能首先被卸载。
最后,对于任何您控制在 WinMain
或 main
中运行的内容的正常关闭,您始终可以在任一函数 returns 之前执行任何需要执行的清理工作,发送控制回到 windows 子系统。对于大多数应用程序需求,这是首选,通常也是最安全的。
如果用户决定强制关闭我的应用程序(比如通过任务管理器),有没有一种方法可以让我在应用程序关闭之前快速执行一些清理代码?我正在用 c++ 编码 btw
如果您使用的是消息泵,请处理 WM_QUIT
消息。
另外:What is the difference between WM_QUIT, WM_CLOSE, and WM_DESTROY in a windows program?
编辑
抱歉,我读到了您想处理终止的事实,例如通过任务管理器。
不过,这可能对您有所帮助:How to catch event when Task manager kill your C++ application
这取决于指示进程如何关闭。可以在正常退出时执行此操作,但不能强制关闭任何内容。
如果进程通过 TerminateProcess
or ExitProcess
, you won't be able to perform any graceful cleanup. TerminateProcess
is how Task Manager and utilities like Sysinternals pskill end a target process. ExitProcess
关闭,则在进程内调用,但通常不用于退出。
如果进程在一个线程(通常是进程中的第一个线程)上有消息泵并且没有其他线程运行是运行代码,其生命周期独立于activity 在该线程中,然后 WM_QUIT
message will signal that the process should close (semantically, that the app should close, your process might conceivably stick around for a while for other reasons), and you can run cleanup code upon receiving the message. Depending on your needs, in a windowed app you might consider performing cleanup operations as early as WM_CLOSE
or WM_DESTROY
.
如果您在 DLL 中编写了代码,您可以在 DllMain
中处理通知,这将允许您执行最后机会清理 (DLL_PROCESS_DETACH
),这可能涵盖进程退出而没有消息泵的情况。但是,这不是对严格依赖任何 C/C++ 运行时(或任何其他 DLL)的代码执行清理的好方法,因为运行时可能首先被卸载。
最后,对于任何您控制在 WinMain
或 main
中运行的内容的正常关闭,您始终可以在任一函数 returns 之前执行任何需要执行的清理工作,发送控制回到 windows 子系统。对于大多数应用程序需求,这是首选,通常也是最安全的。