Windows关机函数ExitWindowsEx使用大全(适用Windows所有操作平台) ( 积分: 100 )

  • 主题发起人 主题发起人 xieyunc
  • 开始时间 开始时间
X

xieyunc

Unregistered / Unconfirmed
GUEST, unregistred 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=5;//好象是5,记不太清了
EWX_FORCEIFHUNG=7;//7?不记得了,有谁好心查下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系统自身关机也必须要走这一流程的。
获取关机特权函数如下:
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;



----------------小宇飞刀(http://xieyunc.blog.163.com/)
 
写得不错
 
如何在所有情况下阻止关机呢?
 
捕获Windows关机事件,Abort这一事件呀!
 
EWX_LOGOFF = 0;
EWX_SHUTDOWN = 1;
EWX_REBOOT = 2;
EWX_FORCE = 4;
EWX_POWEROFF = 8;
EWX_FORCEIFHUNG = $10;
 
用EWX_FORCE就没有关机消息,如何阻止?
 
既然是Force,那当然就不能被阻止了了。
 
EWX_FORCEIFHUNG=$10;我查MSDN EWX_FORCE EWX_FORCEIFHUNG对比如下:
EWX_FORCE
在终端服务开启时无效,不发送WM_QUERYENDSESSION and WM_ENDSESSION messages命令,可能引起数据丢失,所以只能用在紧急的时候。
0x00000004 This flag has no effect if terminal services is enabled. Otherwise, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause applications to lose data. Therefore, you should only use this flag in an emergency.
EWX_FORCEIFHUNG
WM_QUERYENDSESSION or WM_ENDSESSION message如果无响应,强制关闭不支持Windows NT and Windows Me/98/95
0x00000010 Forces processes to terminate if they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message within the timeout interval.
Windows NT and Windows Me/98/95: This value is not supported.
 
感谢楼上,也正因如此我们才会在代码中如此传参调用:
ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
把什么所有关机消息都Send。
 
[8D],感谢 飞刀 大哥整理的这么详细啊。
你的blog我非常喜欢。赞一个~!
 
有没有传染网络邻居大全?
 
写得不错,学习了
 
学习了~~~~~~~~~~~~~~~~~`
 

Similar threads

后退
顶部