请问一下在delphi中如何调用API函数进行对windows的关机,重启等操作。请写下代码!谢谢各位高手。

解决方案 »

  1.   

    1  一个可以使windows2000 , win98 , winnt 关机的程序怎样写
    2  怎样判断当前的操作系统是什么操作系统
      

  2.   

    ExitWindowsEx在NT/2000系统要有系统管理员的权限:
    {*******************************************************************************
        Name:AdjustProcess
        Description:开放权限
        Argument:无
        Result:无
    *******************************************************************************}
    procedure TfrmMain.AdjustProcess;
    var
        VerInfo:TOSVersionInfo;
        hToken:THANDLE;
        tkp:TOKEN_PRIVILEGES;
        Nothing:Cardinal;
    begin
        VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
        GetVersionEx(VerInfo);   //获取当然操作系统信息
        if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then   //NT系统设置权限
        Begin
            OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
            LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
            //LookupPrivilegeValue(nil,'SePowerOffPrivilege',tkp.Privileges[0].Luid);
            tkp.PrivilegeCount:= 1;
            tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
        end;
    end;
    关机函数:        Win32Check(ExitWindowsEx(EWX_POWEROFF,0));
    判断系统版本:GetVersionEx(VerInfo);   //获取当然操作系统信息
      

  3.   

    关于你的第二个问题:
    {$IFDEF WIN32}
    function GetVersionEx(lpOs : pointer) : BOOL; stdcall;
     external 'kernel32' name 'GetVersionExA';
    {$ENDIF}procedure GetWindowsVersion(var Major : integer;
                                var Minor : integer);
    var
     {$IFDEF WIN32}
      lpOS, lpOS2 : POsVersionInfo;
     {$ELSE}
      l : longint;
     {$ENDIF}
    begin
     {$IFDEF WIN32}
       GetMem(lpOS, SizeOf(TOsVersionInfo));
       lpOs^.dwOSVersionInfoSize := SizeOf(TOsVersionInfo);
       while getVersionEx(lpOS) = false do begin
         GetMem(lpos2, lpos^.dwOSVersionInfoSize + 1);
         lpOs2^.dwOSVersionInfoSize := lpOs^.dwOSVersionInfoSize + 1;
         FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
         lpOS := lpOs2;
       end;
       Major := lpOs^.dwMajorVersion;
       Minor := lpOs^.dwMinorVersion;
       FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
     {$ELSE}
      l := GetVersion;
      Major := LoByte(LoWord(l));
      Minor := HiByte(LoWord(l));
     {$ENDIF}
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Major : integer;
      Minor : integer;
    begin
      GetWindowsVersion(Major, Minor);
      Memo1.Lines.Add(IntToStr(Major));
      Memo1.Lines.Add(IntToStr(Minor));
    end;--------------------------------------------------------------------------------
      if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
        ShowMessage('win9x');
      if Win32Platform = VER_PLATFORM_WIN32_NT then
        ShowMessage('winNT');--------------------------------------------------------------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    var
    OS : TOSVersionInfo;
    begin
    OS.dwOSVersionInfoSize := sizeof(OS);
    GetVersionEx(OS);
    with OS do
        case dwPlatformId of
            VER_PLATFORM_WIN32s :
                  label1.caption := 'Windows 3.1x/32s';
            VER_PLATFORM_WIN32_WINDOWS :
                Begin
                    if (dwMajorVersion = 4) and (dwMinorVersion > 0) then
                    label1.caption := 'Windows 98'
                  else
                    label1.caption := 'Windows 95';
                end;
            VER_PLATFORM_WIN32_NT :
                label1.caption := 'Windows NT' ;
          end;
      end;--------------------------------------------------------------------------------
      Const  cOsUnknown : Integer = -1;  cOsWin95 : Integer = 0;  cOsWin98 : Integer = 1;  cOsWin98SE : Integer = 2;  cOsWinME : Integer = 3;  cOsWinNT : Integer = 4;  cOsWin2000 : Integer = 5;  cOsWhistler : Integer = 6;    Function GetOSVersion : Integer;  Function GetOSName( OSCode : Integer ) : String;    Function GetOSVersion : Integer;  Var  osVerInfo : TOSVersionInfo;  majorVer, minorVer : Integer;  Begin  Result := cOsUnknown;  osVerInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );  If ( GetVersionEx( osVerInfo ) ) Then Begin  majorVer := osVerInfo.dwMajorVersion;  minorVer := osVerInfo.dwMinorVersion;  Case ( osVerInfo.dwPlatformId ) Of  VER_PLATFORM_WIN32_NT : { Windows NT/2000 }  Begin  If ( majorVer <= 4 ) Then  Result := cOsWinNT  Else  If ( ( majorVer = 5 ) And ( minorVer= 0 ) ) Then  Result := cOsWin2000  Else  If ( ( majorVer = 5) And ( minorVer = 1 ) ) Then  Result := cOsWhistler  Else  Result := cOsUnknown;  End;  VER_PLATFORM_WIN32_WINDOWS : { Windows 9x/ME }  Begin  If ( ( majorVer = 4 ) And ( minorVer = 0 ) ) Then  Result := cOsWin95  Else If ( ( majorVer = 4 ) And ( minorVer = 10 ) ) Then Begin  If ( osVerInfo.szCSDVersion[ 1 ] = 'A' ) Then  Result := cOsWin98SE  Else  Result := cOsWin98;  End Else If ( ( majorVer = 4) And ( minorVer = 90 ) ) Then  Result := cOsWinME  Else  Result := cOsUnknown;  End;  Else  Result := cOsUnknown;  End;  End Else  Result := cOsUnknown;  End;    Function GetOSName( OSCode : Integer ) : String;  Begin  If ( OSCode = cOsUnknown ) Then  Result := '(sconosciuto)'  Else If ( OSCode = cOsWin95 ) Then  Result := 'Microsoft Windows 95'  Else If ( OSCode = cOsWin98 ) Then  Result := 'Microsoft Windows 98'  Else If ( OSCode = cOsWin98SE ) Then  Result := 'Microsoft Windows 98 Second Edition'  Else If ( OSCode = cOsWinME ) Then  Result := 'Microsoft Windows Millennium Edition'  Else If ( OSCode = cOsWinNT ) Then  Result := 'Microsoft Windows New Technology'  Else If ( OSCode = cOsWin2000 ) Then  Result := 'Microsoft Windows 2000 / NT 5'  Else  Result := 'Microsoft Windows';  End;
      

  4.   

    老话题了;
    ******************
    在Windows2000下关闭计算机
    function ShutDownSystem():BOOL;
    var
      hProcess,hAccessToken:THandle;
      LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
      TOKEN_PRIVILEGES: TTokenPrivileges;
      BufferIsNull:DWORD;
    Const
      SE_SHUTDOWN_NAME='SeShutdownPrivilege';
    begin
      hProcess:=GetCurrentProcess();OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);
      LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
      LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;
      TOKEN_PRIVILEGES.PrivilegeCount:=1;
      TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;
      BufferIsNull:=0;AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVI
    LEGES),Nil,BufferIsNull);
      ExitWindowsEx(EWX_REBOOT, 0);
    ShutDownSystem:=True;
    end;