我知道已经有相关的帖子了,但是看不太懂……我需要的很简单: 
1. xp系统,如何调用及调用哪个函数才能正常关机关机呢?还有哪些因素会影响调用的成功与否呢?
2. 怎么截获关机的消息并使之在关闭系统前执行一定的代码呢?麻烦各位咯!谢谢!

解决方案 »

  1.   

    对了,因为是xp系统,exitWindowsEX是不能用的哦
      

  2.   

    首先要了解Windows的关机的程序。当用户退出Windows时,Windows系统会给每个Top-level的窗体发WM_QUERYENDSESSION 的系统消息,查询能否关机,窗体可在接到此消息时进行结束前的工作(如编辑类的窗体会提示未保存的文件存盘等),窗体返回TRUE为同意关机,FALSE为不同意关机。
    Windows9x等所有的窗体都回应了WM_QUERYENDSESSION后,系统会再发WM_ENDSESSION的消息,消息的wparam 参数为是否结束Windows,若TRUE,窗体要马上结束程序,若FALSE则取消关闭Windows的命令,窗体可以照常工作。只要某一窗体在WM_QUERYENDSESSION返回FALSE(不同意关机),WM_ENDSESSION的wparam即为FALSE。而在Windows NT/2000窗体返回WM_QUERYENDSESSION后马上接到WM_ENDSESSION的消息,不用等其它窗体对WM_QUERYENDSESSION的回应。不管在9x、Nt和2000,各Top-level的窗体都可以“一票否决”取消关闭Windows的命令,这样可以确保应用程序的数据不会丢失。自己的程序可以捕捉上述的两个消息.1. 捕捉windows的关机消息
    private
    procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
    ...
    procedure TForm1.winexit(var msg: Tmessage);
    begin
      {your code here}   
    end;
      

  3.   

    截获关机的消息,注意在你的处理后加上inherited一句
    procedure WMQUERYENDSESSION(var Msg: TWMQUERYENDSESSION); message WM_QUERYENDSESSION;
    ----------------
    procedure TForm1.WMQUERYENDSESSION(var Msg: TWMQUERYENDSESSION);
    begin
      DoSomething; //你的处理
      Inherited;  //加上这句
    end;