BCB做的托盘程序,如果关机时程序还开着,会导致无法正常关机、注销、重启?

ZhouQiang 2003-08-20 09:10:53
我参考了以前的相关贴子,但不管用。

我现在要做到的功能是当Windows系统关机、注销、重启时我的托盘程序能自动退出并响应Windows系统关机、注销、重启操作。

现在关闭托盘程序没有问题,但Windows系统关机、注销、重启不响应。

另外请教一下:
Windows关机、注销、重启时给当前所有运行的应用程序发送的对应消息是什么?
...全文
164 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
TangH 2003-09-19
  • 打赏
  • 举报
回复
D
ZhouQiang 2003-08-21
  • 打赏
  • 举报
回复
问题已解决,谢谢各位支持。

总结一下:

1.与托盘无关。
2.在OnCloseQuery事件需要释放TNMUDP组件。

void __fastcall TFormMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if ( Application->MessageBox("是否退出公文收发系统(客户端) ?", "提示", MB_YESNO | MB_ICONINFORMATION) == IDYES )
{
NMUDPReceive->Free() ;
NMUDPSend->Free() ;
CanClose = true ;
}
else
CanClose = false ;
}

ZhouQiang 2003-08-20
  • 打赏
  • 举报
回复
尝试过各种方法,无效,还是不知何故。
zjqyb 2003-08-20
  • 打赏
  • 举报
回复
看来你只能动态创建new
最后 delete it

try!!!
void __fastcall TForm1::WindowClose(TMessage & Message)
{
// do your code here
//如果有socket控件必须close;

NMUDP1->Destroy();
Message.Result = WM_QUERYENDSESSION;
}

BCB 2003-08-20
  • 打赏
  • 举报
回复
与托盘没关系
退出前,
FormDestry()
{
delete NMUDP1;
}
lltt 2003-08-20
  • 打赏
  • 举报
回复
look
ZhouQiang 2003-08-20
  • 打赏
  • 举报
回复
Close不是NMUDP成员
zjqyb 2003-08-20
  • 打赏
  • 举报
回复
NMUDP 也是socket控件

void __fastcall TForm1::WindowClose(TMessage & Message)
{
// do your code here
//如果有socket控件必须close;

NMUDP1->Close();
Message.Result = WM_QUERYENDSESSION;
}

ZhouQiang 2003-08-20
  • 打赏
  • 举报
回复
问zjqyb():
//如果有socket控件必须close;
何解?
我用的是NMUDP组件.
ZhouQiang 2003-08-20
  • 打赏
  • 举报
回复
//我的OnCloseQuery事件代码如下:
void __fastcall TFormMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{
/*
if ( Application->MessageBox("是否退出公文收发系统(客户端) ?", "提示", MB_YESNO | MB_ICONINFORMATION) == IDYES )
CanClose = true ;
else
CanClose = false ;
//*/
}
ZhouQiang 2003-08-20
  • 打赏
  • 举报
回复
我程序中有socket控件。
zjqyb 2003-08-20
  • 打赏
  • 举报
回复
程序里有socket控件,必须截获WM_QUERYENDSESSION消息并进行处理!!!!
sscwxch 2003-08-20
  • 打赏
  • 举报
回复
BCB自带一托盘列程,看看对你会有所帮助!
Examples/Apps/TrayIcon
zjqyb 2003-08-20
  • 打赏
  • 举报
回复
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage,WindowClose)
END_MESSAGE_MAP(TForm)
};


void __fastcall TForm1::WindowClose(TMessage & Message)
{
// do your code here
//如果有socket控件必须close;
Message.Result = WM_QUERYENDSESSION;
}
jishiping 2003-08-20
  • 打赏
  • 举报
回复
托盘根本不影响关机、注销、重启,肯定是你在Form的OnCloseQuery事件里,设置CanClose
为false后才导致的。如上面所说,程序收到消息WM_QUERYENDSESSION后,这个消息的返回值
需要设为1,同时调用Application->Termiate();强制结束程序。或者在收到消息
WM_QUERYENDSESSION后设置一个变量,在OnCloseQuery事件中检查这个变量决定是否允许关
闭。
jishiping 2003-08-20
  • 打赏
  • 举报
回复
托盘根本不影响关机、注销、重启,肯定是你在Form的OnCloseQuery事件里,设置CanClose
为false后才导致的。如上面所说,程序收到消息WM_QUERYENDSESSION后,这个消息的返回值
需要设为1,同时调用Application->Termiate();强制结束程序。或者在收到消息
WM_QUERYENDSESSION后设置一个变量,在OnCloseQuery事件中检查这个变量决定是否允许关
闭。
ZhouQiang 2003-08-20
  • 打赏
  • 举报
回复
工作环境:Windows2000;BCB6
zjqyb 2003-08-20
  • 打赏
  • 举报
回复
处理WM_QUERYENDSESSION消息
chifengwatch 2003-08-20
  • 打赏
  • 举报
回复
我以前也是碰到同样的问题---不能关机,我曾经试图处理WM_QUERYENDSESSION,但似乎没有大的作用。我的解决办法就是:用NMUDP控件的时候NEW,用完后DELETE。
mme 2003-08-20
  • 打赏
  • 举报
回复
如果你去掉托盘都是不行,那就是是程序有问题了.
加载更多回复(1)

13,825

社区成员

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

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