就是一般的记事本,只要它的内容改变了
在关机的时候就会弹出是否保存的对话框?
注意,是关机的时候,不是说关闭程序的时候
我想实现在关机的时候,我的程序也弹个对话框出来
这样我可以在关机最后一段时间内执行一点动作,然后关闭
请问如何实现?

解决方案 »

  1.   

    截获WM_QueryEndSession消息并做相应处理就可以了。关机或Logff后,Windows会传依序送出WM_QUERYENDSESSION的信息给每个
    Process,如果中间有一个Process不能顺利结束(例如:Word修改后未存档,而出现是
    否存档,但我们按取消),这时该信息执行的结果会传回False(0),这时Windows也就
    不再继续送WM_QUERYENDSESSION给下一个Proccess。反之,如果所有的Process都可以
    顺利结束(也就是每个送出的WM_QUERYENDSESSION都传回True),那才代表以以顺利结束。不管WM_QUERYENDSESSION最后的结果是可以顺利结束或不能顺利结束,Windows会再送
    一个WM_ENDSESSION的信息给所有的Process,而wParam的内容便是指出是否可以顺利
    结束下面的代码是截获消息,使得系统无法关机或者注销。主要内容其实就这一句
    procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;
    将程序保存之后,编译,然后去运行那个编译的程序,你会发现只要此程序运行,系统就无法关机。当然,你可以在这里做其他操作,例如记录日志之类。这里的消息处理只对本程序有效果,如果想扩展应用面,可以做成message hook  dll。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession; 
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.QueryEndSession(var Msg: TMessage);
    begin
      Msg.Result := 0;
    end;
      

  2.   

    如果是要用DLL实现关机保存数据的功能呢?我试过用GETMESSAGE、CALLWNDPROC钩子都不行,哪位高手能给个办法