桌面程序阻止Windows关机(使用Message.Result取得DefWindowProc API函数的返回值,非常重要)

Windows Client 客户端在关机,不外乎两种情况:

 

1. 没有处理 Windows 关机消息;

2.处理了关机消息,但是超时了;

 

上面这两种情况,都会让Windows 关不了机。在现实生活中,这个情况的出现,让用户很头疼!

 

一般出现上面这种情况,要对代码的分析,一定要对消息分发,消息处理的地方进行重点对待。对于Delphi 程序,很多事通过

Var 

 

 aHande:THandle;

begin

 aHande:=AllocateHWnd(WndProc);

end;

 

 

传入 WndProc 过程,如WndProc的原型:  procedure WndProc(var Message: TMessage);  在 WndProc 中一定要注意了,对于

自定义的消息处理外,必须的处理Windows的其他消息。

 

一般的书写方式为:

procedure WndProc(var Message: TMessage);

begin

   if Message.Msg=WM_Reply then //WM_Reply 为自定义消息
    begin
     { WMReply(Message);  这里是对自定义消息的处理}
    end
   else
    begin

         {注意 下面这句话,非常重要,直接调用Window单元 DefWindowProc 进行处理,并且还要指定  Message.Result

        很多代码 是调用   Dispatch(Message);   这样写没有错,在VCL里面,它最终调用 Window单元的                       DefWindowProc,  但是有可能超时,会导致Windows没有收到关机确认消息,而被阻止,不能正常退出。}

         Message.Result :=DefWindowProc(Fhandle,Message.Msg, Message.WParam,Message.LParam);

 

    end;

end;

 

http://blog.csdn.net/tjb_1216/article/details/5664116

posted @ 2017-01-20 00:10  findumars  Views(605)  Comments(0Edit  收藏  举报