首页
社区
课程
招聘
[旧帖] [求助]WM_QUERYENDSESSION消息 0.00雪花
发表于: 2011-6-28 21:30 1822

[旧帖] [求助]WM_QUERYENDSESSION消息 0.00雪花

2011-6-28 21:30
1822
WM_QUERYENDSESSION消息书上说当系统发生停机时 Csrss子系统进程会发给每个进程的消息循环当线程返回true 则系统停机继续进行,然后,csrss再给该线程发送WM_ENDSESSION
消息 请求退出。
#include "stdafx.h"


#define  ENDSESSION_CLOSEAPP 0x00000001

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.

HWND hwnd  =  FindWindow(NULL,TEXT("扫雷"));//找到扫雷句柄
	

	SendMessage(hwnd,WM_QUERYENDSESSION,0,ENDSESSION_CRITICAL);
	
SendMessage(hwnd,WM_ENDSESSION,1,ENDSESSION_CRITICAL);


		return 0;
}


msdn上说:

ENDSESSION_CRITICAL

The application is forced to shut down.意思就是可以强制结束应用程序。
但是我这段程序写起来一开始提示:
“ENDSESSION_CRITICAL”未定义。之后加上了MSDN上定义的常量0x4000000
可以编译通过,但是执行之后扫雷程序依然运行的很正常,不知道为什么
难道是WM_ENDSESSION消息不能结束应用程序·此消息是不是只有Csrss子系统发出才有作用???或者是CSRSS程序在内部还有什么的处理?请大牛指点下??

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
大多数的应用程序是没有必要处理这个消息的。因为DefWindowProc返回TRUE,
会有哪些应用处理这个消息呢?
比如说notepad,word之类的,因为存在尚未保存的内容,但即使处理这个消息,也只会提醒用户,保存那些内容。不会去检查lParam参数,一句话,检查了也没有用啊。

当然,可能某些应用程序去检查lParam,但更多的是不会。
那另外一个问题就是,如果想强制启动系统,应该怎么做?

To force all applications to terminate, use ExitWindowsEx, and specify the EXW_FORCE flag. This prevents the system from sending WM_QUERYENDSESSION messages.

而不是通过设置这个什么参数。
2011-6-29 10:11
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上说的对
2011-6-29 10:17
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你回答的问题不是我所问的吧。。。

我想问:
SendMessage(hwnd,WM_QUERYENDSESSION,0,ENDSESSION_CRITICAL);
       
SendMessage(hwnd,WM_ENDSESSION,1,ENDSESSION_CRITICAL);

为什么结束不掉程序???????
MSDN上说ENDSESSION_CRITICAL是可以可以强制结束应用程序的。
为什么不行?
2011-6-29 12:10
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5

LZ,我不是说了嘛?不是所有的应用程序都处理这个消息的,即使处理了,也不会去检查这个什么参数,从我的经验来说,我写的应用都忽略这个lParam的。

当然,你硬要说MSDN就这么说的,我就没法和你解释了。“尽信书不如无书”,上pediy的,会这么看重文档的嘛。

如果你的目的是终止这个应用,你可以试试发送WM_CLOSE,而不是这个消息。
2011-6-29 13:46
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
我有点明白你的意思了,你是说为什么程序还在,没有终止。
还是因为那个该死的MSDN,

WM_ENDSESSION,

The application need not call the DestroyWindow or PostQuitMessage function when the session is ending.

注意MSDN上说,你不必调用DestroyWindow/PostQuitMessage ,那么谁会调用呢,是OS。这就是你发消息没有用的原因。因为程序要么没处理这个消息,要么处理了消息,但没有调用DestroyWindow/PostQuitMessage, 所以你看到程序还在。

我的印象中,记事本是处理这2个消息的用来保存没有保存的输入,但因为上述原因同样,它也不会终止。

一般这2个消息是由OS发送的,OS会在消息之后,终止所有的进程,程序这个时候才会被终止,而不是收到这个消息的时候。

The MSDN article states "The application need not call the DestroyWindow or PostQuitMessage function when the session is ending." When your msgproc returns from handing WM_ENDSESSION you have only a few seconds to clean up and exit your program. Otherwise the system will nuke your process with TerminateProcess.

If your app reacts badly to TerminateProcess then you need to ignore the MSDN article's advice and execute your normal close sequence: DestroyWindow, PostQuitMessage, etc. This is required if you want to exit gracefully.
2011-6-29 14:00
0
雪    币: 81
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
一般这2个消息是由OS发送的,OS会在消息之后,终止所有的进程,程序这个时候才会被终止,而不是收到这个消息的时候。

The MSDN article states "The application need not call the DestroyWindow or PostQuitMessage function when the session is ending." When your msgproc returns from handing WM_ENDSESSION you have only a few seconds to clean up and exit your program. Otherwise the system will nuke your process with TerminateProcess.

If your app reacts badly to TerminateProcess then you need to ignore the MSDN article's advice and execute your normal close sequence: DestroyWindow, PostQuitMessage, etc. This is required if you want to exit gracefully.


看到这个才明白了,原来OS会在消息之后,终止所有的进程·用TerminateProcess函数结束,
而不是收到我上面问的两个消息结束的,这下终于理解·多谢楼上细心的讲解。3Q
2011-6-29 15:17
0
游客
登录 | 注册 方可回帖
返回
//