如何在基于对话框的MFC程序中阻止关机

chuchong0502 2010-05-29 04:11:02
我是这样实现的:重载了DefWindowProc函数,判断是不是WM_QUERYENDSESSION消息,如果是则返回0,自己实验时,程序检测到了关机消息,但并没有阻止关机,我的代码如下:
LRESULT CGetShutDownDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUERYENDSESSION:
char tmp[10];
sprintf(tmp,"wParam = 0x%x lParam = 0x%x",wParam,lParam);
if(lParam == 0)
{
::MessageBox(0,"收到关机或重启消息",tmp,MB_OK);

}
else
::MessageBox(0,"收到注销消息",tmp,MB_OK);

return 0;
case WM_ENDSESSION:
return 0;
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
请教大家该如何实现?
...全文
882 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chuchong0502 的回复:]
使用wltg2001的方法可以了,感谢wltg2001,感谢大家
[/Quote]
不客气,分给我就行了。
chuchong0502 2010-05-30
  • 打赏
  • 举报
回复
使用wltg2001的方法可以了,感谢wltg2001,感谢大家
wltg2001 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chuchong0502 的回复:]
该怎么处理呢?小弟初学,还望多多指教,非常感谢
[/Quote]
不是说了吗,直接处理WM_QUERYENDSESSION消息就行了,返回FALSE就行了。
比如写成这样:
BOOL CMy999Dlg::OnQueryEndSession()
{
if (!CDialog::OnQueryEndSession())
return FALSE;

// TODO: 在此添加专用的查询结束会话代码

return FALSE;
//return TRUE;
}
chuchong0502 2010-05-30
  • 打赏
  • 举报
回复
该怎么处理呢?小弟初学,还望多多指教,非常感谢
wltg2001 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chuchong0502 的回复:]
谢谢各位,去掉::MessageBox后,可以了,程序运行后,可以阻止关机了,但发现原来的按钮不再响应了,下面是代码:
LRESULT CGetShutDown_MFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUERYENDSESSION:
ret……
[/Quote]
MFC程序为什么要写WindowProc呢?直接在对话框中处理WM_QUERYENDSESSION消息不就行了。
chuchong0502 2010-05-30
  • 打赏
  • 举报
回复
谢谢各位,去掉::MessageBox后,可以了,程序运行后,可以阻止关机了,但发现原来的按钮不再响应了,下面是代码:
LRESULT CGetShutDown_MFCDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUERYENDSESSION:
return 0;
case WM_ENDSESSION:
return 0;
default:
return CDialog::DefWindowProc(message, wParam, lParam);
}
return 0;
}
是不是因为重载WindowProc后引起的呢?该怎么处理呢?
zwfgdlc 2010-05-30
  • 打赏
  • 举报
回复
...........
这样就行了。


LRESULT CMFCTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_QUERYENDSESSION)
return 0;

return CDialog::WindowProc(message, wParam, lParam);
}
wltg2001 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chuchong0502 的回复:]
重载WindowProc函数还是不能阻止关机。
自己搜索了下,在SDK程序里,在
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)中拦截WM_QUERYENDSESSION消息,可以阻止关机,不知是什么原因,现在想在MFC程序里实现
[/Quote]
将你的代码中的所有的::MessageBox都去掉就行了。当MessageBox弹出来时,你后面的return FALSE就不能执行,但是系统给WM_QUERYEDNSESSION的预留时间却不是无限的,在一定时间内不返回FALSE,它就关机。
邓学彬 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chuchong0502 的回复:]
重载WindowProc函数还是不能阻止关机。
自己搜索了下,在SDK程序里,在
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)中拦截WM_QUERYENDSESSION消息,可以阻止关机,不知是什么原因,现在想在MFC程序里实现
[/Quote]

和你写SDK程序是一样的,你子类化一个MFC的顶级窗口就行了。
zwfgdlc 2010-05-29
  • 打赏
  • 举报
回复
我试过在WindowProc阻止注销,关机也应该可以吧。
chuchong0502 2010-05-29
  • 打赏
  • 举报
回复
重载WindowProc函数还是不能阻止关机。
自己搜索了下,在SDK程序里,在
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)中拦截WM_QUERYENDSESSION消息,可以阻止关机,不知是什么原因,现在想在MFC程序里实现
zwfgdlc 2010-05-29
  • 打赏
  • 举报
回复

virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);

重载WindowProc函数。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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