windows 关闭时 会向应用程序 发什么消息

da18a 2004-10-14 07:49:25
如题.
...全文
141 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yueyixing 2004-10-14
  • 打赏
  • 举报
回复
等程序收到windows要退出的消息时,会有一个返回值。如果返回值不对的话,windows是不能退出的。不过这好像是在有bug的情况下才会出现这种情况。比如早期的qq,如果你不退出qq的话,是关不了机的。我记的好像indy系列系列控件中也存在这个bug。
da18a 2004-10-14
  • 打赏
  • 举报
回复
解决了 重载 WndProc 进行处理 就不用 Application.OnMessage:=Form1.AppMessageHandler;

Up 的没分啊!
benjiamen 2004-10-14
  • 打赏
  • 举报
回复
procedure AppMessageHandler(var Msg:TMsg; var Handled:Boolean);
//声明系统处理消息过程,响应Application的OnMessage事件的过程必须为TMessageEvent类型;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AppMessageHandler(var Msg:TMsg;var Handled:Boolean);
begin
if Msg.message=WM_QueryEndSession then
//如果收到的消息为关闭计算机的消息时,进行特别处理,因为只是一个例子,
//我只写出弹出对话框,大家可以根据自己程序的需要进行响应的处理;
begin
if messagedlg('shutdown?',mtconfirmation,mbyesnocancel,0)= mryes then
Handled:=true
else
Handled:=false;
end;
end;
end.
最后在程序的DPR文件中,创建窗体之后但在调用Application.Run前加入
Application.OnMessage:=Form1.AppMessageHandler;即可!

网上去搜一下,可找到一大打.
da18a 2004-10-14
  • 打赏
  • 举报
回复
阻止关闭

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

继续我的问题:

Application 怎么捕捉不到?

procedure TMusicbox.ApplicationEventsMessage(var Msg: tagMSG;
var Handled: Boolean);
begin
if (msg.message = WM_QUERYENDSESSION) Or (msg.message = WM_ENDSESSION) then
self.Caption:='1';
end;
i54 2004-10-14
  • 打赏
  • 举报
回复
UP
CodeProject-Jerry 2004-10-14
  • 打赏
  • 举报
回复
那如何才能阻止windows关闭呢?
benjiamen 2004-10-14
  • 打赏
  • 举报
回复
是WM_QUERYENDSESSION消息

系统将要关闭时,会向每一个程序发送WM_QUERYENDSESSION这条关机消息.
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2004-10-14 07:49
社区公告
暂无公告