laiyiling(【陌生人 V2.0】) Windows NT/2000以及后续版本: 当一个程序响应WM_QUERYENDSESSION并返回TRUE,那么它就会立刻接受到WM_ENDSESSION消息并马上结束,而不管其他的程序是怎么样回应WM_QUERYENDSESSION消息的。Windows 95/98/Me:只有当系统内所有的程序都对WM_QUERYENDSESSION消息回应TRUE之后,他们才会一起接受到WM_ENDSESSION 消息,然后结束。如果要强制关闭所有的程序,使用ExitWindowsEx函数,指定EXW_FORCE标志。如果这样做,系统不发送WM_QUERYENDSESSION 消息,而直接终止正在运行的程序。是不是任务管理器也这样?因为它是采用termilateprocess
//我没有遇到过这个问题啊。既然答应了帮忙,呵呵,我只有搬经典著作了 :)1.Jeffrey 说: 若要终止进程的运行,可以使用下面四种方法: • 主线程的进入点函数返回 • 进程中的一个线程调用E x i t P r o c e s s函数 • 另一个进程中的线程调用Te r m i n a t e P r o c e s s函数 • 进程中的所有线程自行终止运行(鄙人说:其中,只有第3种方法终止运行的进程“绝对得不到关于它将终止运行的任何通知,因为应用程序无法正确地清除,并且不能避免自己被撤消(除非通过正常的安全机制)”,那么你如果用其它方法杀死进程A,你都能监测的。下面是关于用TerminateProcess杀死进程:)2. 大师他老人家又说: 注意Te r m i n a t e P r o c e s s函数是个异步运行的函数,也就是说,它会告诉系统,你想要进程终止运行,但是当函数返回时,你无法保证该进程已经终止运行。因此,如果想要确切地了解进程是否已经终止运行,必须调用Wa i t F o r S i n g l e O b j e c t函数。(鄙人:你去查查WaitForSingleObject(),那么你的问题也解决了。)3.后话: 我有个小小的想法:你杀一个进程的时候可以发一个自定义消息也可以解决问题(缺点是万一杀不死呢)
Windows NT/2000以及后续版本: 当一个程序响应WM_QUERYENDSESSION并返回TRUE,那么它就会立刻接受到WM_ENDSESSION消息并马上结束,而不管其他的程序是怎么样回应WM_QUERYENDSESSION消息的。嗯,这样的话,你根本不能处理
to I_Love_CPP(我爱C++) ,谢谢老兄。不过,可能老兄误解我的意图了,是我没有讲明白, 我想实现的目的: 我有拨号程序A,在A中它有一些功能块,譬如:拨号,挂断。我现在就是为了实现防杀功能。因为如果用户强制性杀掉程序,这时候,程序是无法正常调用挂断模块的。所以,即使没有了程序A,用户依旧能上网。我就想,当用户强制性杀掉A时,我就立即能得知这个消息,然后也立即挂断网络。 所以说,不是我主动发起Te r m i n a t e P r o c e s s,是被动的被kill 如果没有别的更好的办法,就采用土办法了。呵呵
谢谢提示,你手边有这书吗?我这里没有,哪位兄弟帮我瞧瞧
可以写wdm.hook sver.
因为我记得有本书上说调用这个terminateprocess函数之后,被杀的那个进程是没机会做任何反应的
WM_QUERYENDSESSION = $0011;
若要终止进程的运行,可以使用下面四种方法:
• 主线程的进入点函数返回
• 进程中的一个线程调用E x i t P r o c e s s函数
• 另一个进程中的线程调用Te r m i n a t e P r o c e s s函数
• 进程中的所有线程自行终止运行(鄙人说:其中,只有第3种方法终止运行的进程“绝对得不到关于它将终止运行的任何通知,因为应用程序无法正确地清除,并且不能避免自己被撤消(除非通过正常的安全机制)”,那么你如果用其它方法杀死进程A,你都能监测的。下面是关于用TerminateProcess杀死进程:)2. 大师他老人家又说:
注意Te r m i n a t e P r o c e s s函数是个异步运行的函数,也就是说,它会告诉系统,你想要进程终止运行,但是当函数返回时,你无法保证该进程已经终止运行。因此,如果想要确切地了解进程是否已经终止运行,必须调用Wa i t F o r S i n g l e O b j e c t函数。(鄙人:你去查查WaitForSingleObject(),那么你的问题也解决了。)3.后话:
我有个小小的想法:你杀一个进程的时候可以发一个自定义消息也可以解决问题(缺点是万一杀不死呢)
我想实现的目的:
我有拨号程序A,在A中它有一些功能块,譬如:拨号,挂断。我现在就是为了实现防杀功能。因为如果用户强制性杀掉程序,这时候,程序是无法正常调用挂断模块的。所以,即使没有了程序A,用户依旧能上网。我就想,当用户强制性杀掉A时,我就立即能得知这个消息,然后也立即挂断网络。
所以说,不是我主动发起Te r m i n a t e P r o c e s s,是被动的被kill
如果没有别的更好的办法,就采用土办法了。呵呵
#define SIGINT 2 /* interrupt */
#define SIGILL 4 /* illegal instruction - invalid function image */
#define SIGFPE 8 /* floating point exception */
#define SIGSEGV 11 /* segment violation */
#define SIGTERM 15 /* Software termination signal from kill */
#define SIGBREAK 21 /* Ctrl-Break sequence */
#define SIGABRT 22 /* abnormal termination triggered by abort call */signal()...
<<Windows 核心编程>> Dll 部分 有详细讲解