標籤:
轉自:http://blog.sina.com.cn/s/blog_611ab6c50100mznx.html
{=======================================================================================================================
關閉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?
- 擷取關機特權函數如下:
- 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);//強行關機
由於我們需要製作一個通用的關機程式,故要對當前的作業系統進行判斷,這個比較簡單,函數如下:
- function GetOperatingSystem: string;//擷取作業系統資訊
- var osVerInfo: TOSVersionInfo;
- begin
- Result :=‘‘;
- osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
- if GetVersionEx(osVerInfo) then
- case osVerInfo.dwPlatformId of
- VER_PLATFORM_WIN32_NT:
- begin
- Result := ‘Windows NT/2000/XP‘
- end;
- VER_PLATFORM_WIN32_WINDOWS:
- begin
- Result := ‘Windows 95/98/98SE/Me‘;
- end;
- end;
- end;
-
- 執行關機的主函數:
- procedure ShutDownComputer;
- begin
- if GetOperatingSystem=‘Windows NT/2000/XP‘ then
- begin
- Get_Shutdown_Privilege;
- //調用此函數會出現系統關機提示視窗,並允許使用者取消關機動作
- //InitiateSystemShutDown(nil,‘關機提示:討厭你所以關了你!‘,0,True,False);
- ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
- end else
- begin
- ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
- end;
- end;
- =========================================================================================================================}
-
- 使用:
-
- procedure TShutDownForm.btn_PowerOffClick(Sender:Object);
- begin
- ShutDownComputer;
- end;
DELPHI實現關機,相容全部WINDOWS系統