控制台程序退出事件接收的疑问!

奔跑的大象 2013-05-20 05:13:04
先上代码:
// project -> settings->general->microsoft foundation classes 中选中use mfc as shared dll 
#include <afxmt.h>// for cevent
#include <afxwin.h> // for messagebox
CEvent g_event;

// 系统会创建一个新的线程执行HandlerRoutine
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
BOOL bRet = FALSE;
switch (dwCtrlType)
{
case CTRL_C_EVENT:
MessageBox(NULL,
L"CTRL+C received!",L"CEvent",MB_OK);
break;
case CTRL_BREAK_EVENT:
MessageBox(NULL,
L"CTRL+BREAK received!",L"CEvent",MB_OK);
break;
case CTRL_CLOSE_EVENT:
MessageBox(NULL,
L"Program being closed!",L"CEvent",MB_OK);
break;
case CTRL_LOGOFF_EVENT:
MessageBox(NULL,
L"User is logging off!",L"CEvent",MB_OK);
break;
case CTRL_SHUTDOWN_EVENT:
MessageBox(NULL,
L"User is logging off!",L"CEvent",MB_OK);
break;
default:
MessageBox(NULL,
L"该命令不详...",L"CEvent",MB_OK);
bRet = FALSE;;
}
return bRet;
}
void main()
{
VERIFY(0 != SetConsoleCtrlHandler(HandlerRoutine,TRUE) );

WaitForSingleObject(g_event.m_hObject,INFINITE);//等待系统注销、关机消息

SetConsoleCtrlHandler(HandlerRoutine,FALSE);

}


上面这段代码功能是,接收该程序及关机的消息,现在有个问题,这段代码写成DEMO,在win7上没问题的,在XP下除了CTRL_CLOSE_EVENT这个消息,其它消息都能接收到,这是为什么?
(工程需要改成“在共享 DLL 中使用 MFC”或者“在静态库中使用 MFC”)。
...全文
225 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
youyou1912 2013-05-20
  • 打赏
  • 举报
回复
引用 4 楼 zhaobangyu 的回复:
[quote=引用 1 楼 youyou1912 的回复:] CUI还是GUI? 如果是GUI, 可能收到WM_QUERYENDSESSION直接退出了. 而没有收到这个消息. SetConsoleCtrlHandler This function provides a similar notification for console application and services that WM_QUERYENDSESSION provides for graphical applications with a message pump. You could also use this function from a graphical application, but there is no guarantee it would arrive before the notification from WM_QUERYENDSESSION.
应该是CUI的,刚刚测试了下,感觉对话框应该是弹出来了,但是很快就关闭了。在CTRL_CLOSE_EVENT写了一个创建文件操作,的确是创建了,难道是XP和win7的消息机制不一样,XP不等用户操作就强行关闭吗?[/quote] 系统只提供10s的时间给程序退出清理使用.
奔跑的大象 2013-05-20
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\
http://download.csdn.net/detail/zhao4zhong1/3461309




赵老师的例子测试了一下,效果一样,对话框不等用户操作,直接关闭,说明这个消息是经过了,但是系统并没有等待用户操作,直接关闭程序。自己再顶个。
奔跑的大象 2013-05-20
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
改为BOOL bRet = TRUE;试试看。
测试了,不行的。
奔跑的大象 2013-05-20
  • 打赏
  • 举报
回复
引用 1 楼 youyou1912 的回复:
CUI还是GUI? 如果是GUI, 可能收到WM_QUERYENDSESSION直接退出了. 而没有收到这个消息. SetConsoleCtrlHandler This function provides a similar notification for console application and services that WM_QUERYENDSESSION provides for graphical applications with a message pump. You could also use this function from a graphical application, but there is no guarantee it would arrive before the notification from WM_QUERYENDSESSION.
应该是CUI的,刚刚测试了下,感觉对话框应该是弹出来了,但是很快就关闭了。在CTRL_CLOSE_EVENT写了一个创建文件操作,的确是创建了,难道是XP和win7的消息机制不一样,XP不等用户操作就强行关闭吗?
图灵狗 2013-05-20
  • 打赏
  • 举报
回复
改为BOOL bRet = TRUE;试试看。
赵4老师 2013-05-20
  • 打赏
  • 举报
回复
console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309
youyou1912 2013-05-20
  • 打赏
  • 举报
回复
CUI还是GUI? 如果是GUI, 可能收到WM_QUERYENDSESSION直接退出了. 而没有收到这个消息. SetConsoleCtrlHandler This function provides a similar notification for console application and services that WM_QUERYENDSESSION provides for graphical applications with a message pump. You could also use this function from a graphical application, but there is no guarantee it would arrive before the notification from WM_QUERYENDSESSION.

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧