{
文章名 : WinNT以上如何通过程序快速关机
说明 : 无
作者 : JJony
QQ : 254706028
博客 : http://blog.csdn.net/jzj_jony
空间 : http://jonychen,ys168.com
测试环境 : WinXPSP2,Win2003SP1
声明 : 您可以任意转载,但请注明文章作者和出处
}
WinNT以上如何通过程序快速关机
看到网上有很多人问在WinNT以上操作系统中不能通过直接调用ExitWindowsEx
关机,我这里介绍两种方法进行关机。
在WinNT以上操作系统不能直接用ExitWindowsEx关机,而要先获得关机权限
SE_SHUTDOWN_NAME(SeShutdownPrivilege),下面给出代码:
//获取系统相关权限
function EnableDebugPrivilege(PName:pchar):Boolean;
var
TokenHandle:THandle;
DebugNameValue:TLargeInteger;
Privileges:TOKEN_PRIVILEGES;
RetLen:Cardinal;
begin
Result:=False;
if not OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle) then Exit;
if not LookupPrivilegeValue(nil,PName,DebugNameValue) then
begin
CloseHandle(TokenHandle);
Exit;
end;
Privileges.PrivilegeCount:=1;
Privileges.Privileges[0].Luid:=DebugNameValue;
Privileges.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
Result:=AdjustTokenPrivileges(TokenHandle,False,Privileges,SizeOf(Privileges),nil,RetLen);
CloseHandle(TokenHandle);
end;
//获取关机权限
EnableDebugPrivilege('SeShutdownPrivilege');
这样我们就有了关机权限了,下面说说如何关机,有2个API函数可以做到ExitWindowsEx和InitiateSystemShutdown
其中ExitWindowsEx我们常用可以这样调用ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF,0);
快速关机;
InitiateSystemShutdown我们不常用,其原形为:
function InitiateSystemShutdown(
lpMachineName:pchar;//机器名如果本地设为nil,远程格式为//远程机器名
lpMessage: PChar; //关机消息
dwTimeout: DWORD; //倒计时关机时间秒
bForceAppsClosed:bool;//是否强制关闭应用程序
bRebootAfterShutdown: BOOL//是否在关机后重起
): BOOL; stdcall;
利用InitiateSystemShutdown关机:
1.显示倒计时关机对话框关机
EnableDebugPrivilege('SeShutdownPrivilege');
InitiateSystemShutdown(nil,'关机消息测试',60,true,false);
这时系统出现倒计时关机对话框,并倒计时60秒后关机
2.不显示倒计时关机对话框直接关机
EnableDebugPrivilege('SeShutdownPrivilege');
InitiateSystemShutdown(nil,'关机消息测试',0,true,false);
这里只需要把关机时间设为0,不显示关机对话框,和用ExitWindowsEx效果一样
说完了,其实除了这两种方法还有其他方法的,那就靠你自己捉摸了,希望我写的这些对你有所帮助。