关于程序退出的奇怪问题!

Lersh 2002-07-19 09:34:19
在一个程序里注册了系统热键,并且在OnClose里写了CanClose=false;就是说点击X不许退出,除非满足一个条件才调用自己写的一个退出函数(这个函数正确无误,注销了系统热键),但是在关机时,该程序却无法结束进程,表面上是关掉了,但在进程察看器理缺陷是没有退出,造成无法关机,无法重起,无法注销……
请问如何解决这个问题?如何得知系统在关机(重起,注销)时发给程序的退出消息?
...全文
89 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2002-07-21
  • 打赏
  • 举报
回复
有一点忘了,在OnQueryEndSession里,需要将Msg.Result设成TRUE才可以,
这才是导致再按一次注销、重起、关机才行的原因。
void __fastcall TForm1::OnQueryEndSession(TMessage& Msg)
{
EnableClose = true; Msg.Result = TRUE;
}
jishiping 2002-07-21
  • 打赏
  • 举报
回复
最好的方法,就是用一个变量,表示是否允许退出。缺省值为false,表示不
允许退出。当执行你自己的函数时或者受到消息WM_QUERYENDSESSION时,将
这个变量设成true。这样在OnQueryClose里,判断这个变量就可以了。
bool EnableClose = false;
void __fastcall TForm1::OnQueryEndSession(TMessage& Msg)
{
EnableClose = true;
}

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
CanClose = EnableClose;
}
Lersh 2002-07-21
  • 打赏
  • 举报
回复
jishiping(JSP 季世平),有一个问题,在OnQueryClose里加入CanClose=false;然后用这个方法的话,按下注销、充气、关机,程序退出后,Windows就暂停了,要再按一次注销、重起、关机才行……
jishiping 2002-07-20
  • 打赏
  • 举报
回复
如 kingcaiyao(AKing) 所说。
uio45757 2002-07-20
  • 打赏
  • 举报
回复
刚好遇上这个问题,我是从那个
OnCloseQuery那里解决了窗体关闭的问题的
你说的注册了系统热键,是什么来的,我来帮你提前一下
jishiping 2002-07-20
  • 打赏
  • 举报
回复
class TForm1 : public TForm
{
private:
void __fastcall OnQueryEndSession(TMessage&);
public:
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, OnQueryEndSession);
END_MESSAGE_MAP(TForm)
};

void __fastcall TForm1::OnQueryEndSession(TMessage& Msg)
{
//这儿加上你的允许退出的条件,或者直接调用
Application->Terminate();
}
Lersh 2002-07-20
  • 打赏
  • 举报
回复
public:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, OnExit);
END_MESSAGE_MAP(TForm);
这样可以吗?
Lersh 2002-07-20
  • 打赏
  • 举报
回复
就是说要重载WM_QUERYENDSESSION消息是吗?拦截系统消息?
niu_zai 2002-07-20
  • 打赏
  • 举报
回复
应该只能在OnCloseQuery里面,才能写CanClose := Flase;
whitetiger8 2002-07-19
  • 打赏
  • 举报
回复
来晚了,我感觉楼上2位的方法就行了。
dragonhux 2002-07-19
  • 打赏
  • 举报
回复
除了楼上说的外,还要注意一下OnQueryClose事件!
注意CanClose一定要付值!
网事随逢 2002-07-19
  • 打赏
  • 举报
回复
1.是否CanClose=true了?
kingcaiyao 2002-07-19
  • 打赏
  • 举报
回复
1.关于第1个问题,你要检查你的程序代码。
2.系统在关机时,会发送WM_QUERYENDSESSION消息,你可以重载这个消息来处理一些事情。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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