Delphi 程序从进程中结束的事件

Delphi 程序从进程中结束的事件,第1张

当正常情况下结束一个程序(就是点击窗口右上方那个叉叉),系统会向程序发送WM_CLOSE消息,然后程序的消息循环里面就会响应并处理这个消息,进行结束工作,最后再调用API函数结束自身。消息事件中并不存在进程中被结束的事件,你在进程被结束前,通过事件驱动方式能够接管程序的最后机会就是在处理WM_CLOSE事件中,而Onclose,Ondestroy,OnCloseQuery这几个事件中其实是响应WM_CLOSE消息,如果是用任务管理器或者其他进程管理类的软件来结束程序,那么软件会调用API函数TerminateProcess,其原型BOOL TerminateProcess( HANDLEhProcess // 将被结束进程的句柄 UINTuExitCode // 指定进程的退出码 )

如果你一定要在进程被结束中处理程序,那么你可以尝试用全局的API Hook,给TerminateProcess函数挂钩

有三个解决办法。

第一个比较安全:

声明一个全局变量, 在线程2的循环过程中判断这个变量的值,如果是我们期望的值,则退出循环中止线程。

第二个方法,使用消息机制:

在线程循环中建立消息循环, 当接收到有指定的消息时退出循环中止线程。

第三个方法,直接使用API: TerminateThread

使用API TerminateThread 可以强行中止一个线程。 参考资料: http://baike.baidu.com/view/2311208.htm

设置一个全局变量,一个子程序里面执行死循环时,当这个为false时,就执行死循环,true时就退出执行,在另一个子程序中,设置这个全局变量的值来中止这个死循环,但是,必须是多线程的情况下才可以的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7881889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存