我想在一个DLL文件中实现一个在系统关机、重启、注销前保存数据的功能,想用GetMessage钩子来得到,于是写了以下代码,可是一点用也没有,请问这是为什么MsgHook:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,0,GetCurrentThreadId);function MsgProc(ncode,wparam,lparam:Integer):LRESULT;stdcall;
var
  mess:Cardinal;
begin
  mess:=pmsg(lparam)^.message;
  if (mess=WM_QUERYENDSESSION) or (mess=WM_ENDSESSION) or (mess=ENDSESSION_LOGOFF)then
  begin
    SaveInfo;
  end;
  Result:=CallNextHookEx(msgHook,ncode,wparam,lparam);
end;我找到一个在有窗体的EXE中拦截关机消息的程序,和一般的有点不一样,:
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QueryEndSession;//通常好像都是(var Msg:TMessage)procedure TForm1.WMQueryEndSession(var Msg : TWMQueryEndSession);
begin
Msg.Result := 0;
Wnd1:= FindWindow('Shell_TrayWnd', nil);
Wnd:=FindWindow('Progman', nil);
Wnd:=FindWindowEx(Wnd, HWND(0), 'ShellDll_DefView', nil);
EnableWindow(Wnd1, False);
EnableWindow(Wnd, False);
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1, @pv,0);
a:=0;
form1.show;
end;