Windows关机函数ExitWindowsEx使用大全-Delphi,适用Windows所有操作平台

{=======================================================================================================================

关闭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;

另一个关机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. procedure ShutDownComputer;
  20. begin
  21. if GetOperatingSystem='Windows NT/2000/XP' then
  22. begin
  23. Get_Shutdown_Privilege;
  24. //调用此函数会出现系统关机提示窗口,并允许用户取消关机动作
  25. //InitiateSystemShutDown(nil,'关机提示:讨厌你所以关了你!',0,True,False);
  26. ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
  27. end else
  28. begin
  29. ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
  30. end;
  31. end;
  32. =========================================================================================================================}
  33. 使用:
  34. procedure TShutDownForm.btn_PowerOffClick(Sender:Object);
  35. begin
  36. ShutDownComputer;
  37. end;