Windows關機函數ExitWindowsEx使用大全-Delphi(適用Windows所有操作平台)

來源:互聯網
上載者:User

{=======================================================================================================================
關閉Windows函數ExitWindowsEx(UINT uFlag,DWORD:dwReserved)說明:

 

控制WINDOWS的開關:如關閉WINDOWS,重新啟動WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是實現這一功能的API函數。如果Complile時提示EWX_XXXX未定義,那麼請手動定義這幾個常數,預設情況下是無需我們手動定義的。
const
 EWX_FORCE=4; //關閉所有程式並以其他使用者身份登入?(!!應為“強制執行否”吧!!)
 EWX_LOGOFF=0; //重新啟動電腦並切換到MS-DOS方式
 EWX_REBOOT=2; //重新啟動電腦
 EWX_SHUTDOWN=1;//關閉電腦
 EWX_POWEROFF=8;//切斷電源
 EWX_FORCEIFHUNG=$10;//不記得了,有誰好心查下MSDN
調用方法:
 ExitWindowsEx(EWX_REBOOT,0); //重啟電腦
 ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0); //強行關機

 不過博主經常聽到有人說這一API只在Windows 95/98/98SE/Me下有效,而在Windows NT/2000/XP下無效。
 其實這是不正確的,這一API在上述平台下均是有效,只是我們在Windows NT/2000/XP平台下執行此函數之前,必須要擷取得關機特權罷了,其實就算是Windows NT/2000/XP系統自身關機也必須要走這一流程的。

view plainprint?
  1. 擷取關機特權函數如下:  
  2. procedure Get_Shutdown_Privilege; //獲得使用者關機特權,僅對Windows NT/2000/XP  
  3. var   
  4.   rl: Cardinal;  
  5.   hToken: Cardinal;  
  6.   tkp: TOKEN_PRIVILEGES;   
  7. begin   
  8.   OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);  
  9.   if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then  
  10.   begin  
  11.     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
  12.     tkp.PrivilegeCount := 1;  
  13.     AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);  
  14.   end;  
  15. end;  

 擷取關機特權函數如下:  procedure Get_Shutdown_Privilege; //獲得使用者關機特權,僅對Windows NT/2000/XP  var    rl: Cardinal;    hToken: Cardinal;    tkp: TOKEN_PRIVILEGES;  begin    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then    begin      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;      tkp.PrivilegeCount := 1;      AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);    end;  end;
 另一個關機API,InitiateSystemShutdown(PChar(Computer_Name),PChar(Hint_Msg),Time,Force,Reboot);在Windows NT/2000/XP平台下還會自動調用系統本身的關機提示視窗。
 InitiateSystemShutdown(PChar(Computer_Name), PChar(Hint_Msg),Time,Force,Reboot);
                      //關機電腦名稱,關機提示資訊,停留時間長度,是否強行關機,是否要重啟
 當我們把Computer_Name設為nil時,預設為本機,如 InitiateSystemshutdown(nil,nil,0,True,False);//強行關機

 

 由於我們需要製作一個通用的關機程式,故要對當前的作業系統進行判斷,這個比較簡單,函數如下:

  1.   function GetOperatingSystem: string;//擷取作業系統資訊  
  2.   var  osVerInfo: TOSVersionInfo;  
  3.   begin  
  4.     Result :='';  
  5.     osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);  
  6.     if GetVersionEx(osVerInfo) then  
  7.       case osVerInfo.dwPlatformId of  
  8.       VER_PLATFORM_WIN32_NT:  
  9.       begin  
  10.         Result := 'Windows NT/2000/XP'  
  11.       end;  
  12.       VER_PLATFORM_WIN32_WINDOWS:  
  13.       begin  
  14.         Result := 'Windows 95/98/98SE/Me';  
  15.       end;  
  16.     end;  
  17.   end;  
  18.   
  19.   執行關機的主函數:  
  20.   procedure ShutDownComputer;  
  21.   begin  
  22.     if GetOperatingSystem='Windows NT/2000/XP' then   
  23.     begin   
  24.       Get_Shutdown_Privilege;  
  25.       //調用此函數會出現系統關機提示視窗,並允許使用者取消關機動作  
  26.       //InitiateSystemShutDown(nil,'關機提示:討厭你所以關了你!',0,True,False);  
  27.       ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);  
  28.     end else  
  29.     begin  
  30.       ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);  
  31.     end;  
  32.   end;   
  33. =========================================================================================================================}  
  34.   
  35. 使用:  
  36.   
  37. procedure TShutDownForm.btn_PowerOffClick(Sender:Object);  
  38. begin  
  39.   ShutDownComputer;  
  40. end; 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: