我想对关机作特殊的处理,在截拦关机消息后,发现关机和重启的消息一样,
但我只想关机作特殊的处理,所以不知有那位高手可以指点指点怎么区别windows的关机和重启。

解决方案 »

  1.   

    function ShutdownPC(Action : Integer) : boolean;
      const
        ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
        SHTDWN_PRIV = 'SeShutdownPrivilege';
        PRIV_SIZE = sizeOf(TTokenPrivileges);
      var
        uFlags: Cardinal;
        Len: DWORD;
        TokenPriv, Dummy: TTokenPrivileges;
        Token: THandle;
        Error: integer;
      begin
        error := 0;
        if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
          Error := Error or 4;
        if not LookupPrivilegeValue(nil, SHTDWN_PRIV, TokenPriv.Privileges[0].Luid) then
          Error := Error or 8;
        TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        TokenPriv.PrivilegeCount := 1; // One privilege to set
        if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE, Dummy, Len) then
          Error := Error or 16;
        case Action of
          0: uFlags := EWX_POWEROFF + EWX_SHUTDOWN; //提示关机
          1: uFlags := EWX_POWEROFF + EWX_FORCE; //强制关机
          2: uFlags := EWX_ReBoot; //提示重启系统
          3: uFlags := EWX_ReBoot + EWX_FORCE; //强制重启系统
        end;    
        if Application.MessageBox(PChar('您是否要执行 ''' + inttostr(cbAction.ItemIndex) +':'+ cbAction.Text +''' 操作?'),PChar('提示'),MB_YESNO + MB_ICONQUESTION) = IDYES then
          ExitWindowsEx(uFlags, 0);
        Result := (Error = 0);
      end;
      

  2.   

    WM_ENDSESSION,WM_QUERYSESSION消息.
    不过好象确实是一样的
    你就把她理解为重启也要经历关机过程吧
    不知道你这样区分用意何在?