Windows XP中如果想在程序中直接关闭计算机该如何处理?或者能锁定桌面也行~~!?多谢~

解决方案 »

  1.   

    function SetPrivilege(aPrivilegeName : string; 
                          aEnabled : boolean ): boolean; 
    var 
      TPPrev, 
      TP         : TTokenPrivileges; 
      Token      : THandle; 
      dwRetLen   : DWord; 
    begin 
      Result := False; 
      OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES 
                       or TOKEN_QUERY,
                        Token );  TP.PrivilegeCount := 1; 
      if( LookupPrivilegeValue(nil, PChar( aPrivilegeName ), 
                               TP.Privileges[ 0 ].LUID ) ) then 
      begin 
        if( aEnabled )then 
          TP.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED 
        else
          TP.Privileges[0].Attributes:= 0;     dwRetLen := 0; 
        Result := AdjustTokenPrivileges(Token,False,TP, 
                                        SizeOf( TPPrev ), 
                                        TPPrev,dwRetLen ); 
      end;   CloseHandle( Token ); 
    end; 
    function WinExit( iFlags : integer ) : boolean;
    //   possible Flags:
    //   EWX_LOGOFF
    //   EWX_REBOOT
    //   EWX_SHUTDOWN
    begin
      Result := True;
      if( SetPrivilege( 'SeShutdownPrivilege', true ) ) then
      begin
        if( not ExitWindowsEx( iFlags, 0 ) )then
        begin
          Result := False;
        end;
        SetPrivilege( 'SeShutdownPrivilege', False )
      end
      else
      begin
        Result := False;
      end;
      

  2.   

    rocedure shutdown;
    var EWX_SHUTDOWN,EWX_FORCE:integer;
        VerInfo: TOSVersionInfo;
        hToken: THANDLE;
        tkp: TOKEN_PRIVILEGES;
        Nothing: Cardinal;
    begin    
        EWX_SHUTDOWN:=1;
        EWX_FORCE:=4;
        VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
        GetVersionEx(VerInfo);
        if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then 
        begin
          OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
            hToken);
          LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
          tkp.PrivilegeCount := 1;
          tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
          AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, Nothing);
        end;
        ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF, 0);
    end;
    就可以直接关闭计算机了。代码是以前这里发过的
      

  3.   

    用API好象有个什么closewindowEx的