截获WM_QUERYENDSESSION消息,Windows不能关闭。

shadowstar 2002-10-21 05:15:38
请问有什么好的解决办法?

//---------------------------------------------------------------------------
//让程序一直运行,直到关机
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
CanClose = m_bSystemShutdown;
}
//---------------------------------------------------------------------------
//接到系统关闭的消息WM_QUERYENDSESSION,设置m_bSystemShutdown为true
//并把消息还回消息队列
MESSAGE void TForm1::OnQueryEndSession(TMessage &Msg)
{
m_bSystemShutdown = true;
Application->Dispatch(&Msg);
}
...全文
317 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowstar 2002-10-27
  • 打赏
  • 举报
回复
可能是我没表达清楚。

我的意思是我的程序不能被用户杀死,因此必须先退出我的程序才能关机,这样给用户带来不便。
有没有什么办法可以使我的程序随便windows退出而退出。
shadowstar 2002-10-27
  • 打赏
  • 举报
回复
可能是我没表达清楚。

我的意思是我的程序不能被用户杀死,因此必须先退出我的程序才能关机,这样给用户带来不便。
有没有什么办法可以使我的程序随便windows退出而退出。
大大怪老张 2002-10-24
  • 打赏
  • 举报
回复
没明白楼主的意思...

如果不想让用户关掉自己的程序的话,可以在win9x 下隐藏它,在winnt/2000/xp 下作成服务.
Iwant 2002-10-24
  • 打赏
  • 举报
回复
在 win98 里面可以 这样。
但是在 win2k winnt,win xp 里面 就必须先取得系统 管理的权限 后才能
调用成功。。。怎么取,我忘记了。
hunter_bobo 2002-10-22
  • 打赏
  • 举报
回复
form的onclose事件中:Action=caNone;
shadowstar 2002-10-21
  • 打赏
  • 举报
回复
to: andy_lau()
我是用这种方法不行才加上那句代码的!
shadowstar 2002-10-21
  • 打赏
  • 举报
回复
to: NowCan(能量、激情、雨水、彩虹——雷雨云)
我不是想阻止Windows关机,而是让Windows能关机,但我的程序为了不让用户关掉在平时都使 CanClose = false;

另外,如何把你的代码加到我的程序里呢?
andy_lau 2002-10-21
  • 打赏
  • 举报
回复
MESSAGE void TForm1::OnQueryEndSession(TMessage &Msg)
{
m_bSystemShutdown = true;
return;
}
andy_lau 2002-10-21
  • 打赏
  • 举报
回复
可以在WindowProc()中截获这个消息,也可以使用你的方法

你的程序的问题就在于:你把消息又返回给了系统,然系统一直循环的执行这个消息处理,如果你只是要使Windows不能关闭,那么直接return就可以了

MESSAGE void TForm1::OnQueryEndSession(TMessage &Msg)
{
m_bSystemShutdown = true;
return;}
NowCan 2002-10-21
  • 打赏
  • 举报
回复
是不让系统关机?
如何禁止Windows关机呢?换句话说,如何得到Windows关机的通知呢?

原理:Windows在关机的时候会想所有顶层窗口广播一个消息WM_QUERYENDSESSION,其lParam参数可以区分是关机还是注销用户(注销用户时lParam是ENDSESSION_LOGOFF)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。而且通过这个例子,大家也应该可以区分系统关机和注销用户了吧(本例子不能区分)。下面看例子,例子的源程序在这里。

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

switch (iMsg)
{

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
case WM_QUERYENDSESSION:
::MessageBox(hwnd,"未经本程序许可,你不能关机!","禁止关机",MB_OK|MB_SYSTEMMODAL);

return 0;//此处返回0则不能关机,返回1就能关机。
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}


为了节省篇幅,这里之列出了消息处理过程。为了更清楚的看到消息处理,这个例子没有用VCL,而是直接使用了SDK。

另外,这个程序也不是绝对能阻止Windows关机,因为如果某个应用程序调用ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);来关机,我这个程序就阻止不了,应为那样调用ExitWindowsEx,系统不会发出WM_QUERYENDSESSION消息,我那个程序也就没有用了,呵呵。

 

602

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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