关机与禁止关机代码
今天抽空,写完了定时关机程序的代码,测试了一下,还不错,以前写过个禁止关机的程序,用来测试一下,看哪个强,先运行禁止关机的程序,用Windows xp的关闭计算机试了一下,关不了.
代码很少:
private
procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;
procedure TForm1.QueryEndSession(var Msg:TMessage);
begin
Msg.Result:=0;
end;
就是收到关机消息后返回0,告知还不能关机.
而定时关机这边主要是用这条API指令来关机:
BOOL ExitWindowsEx(
UINT uFlags, // 关闭操作
DWORD dwReserved // 保留,0即可.
) ;
其中参数uFlags的取值及其含义:
EWX_FORCE 在紧急情况下强制关机。
EWX_LOGOFF 以其他用户身份登录。
EWX_POWEROFF 关闭系统并关闭电源。
EWX_REBOOT 重新启动。
EWX_SHUTDOWN 安全地关机。
测试了一下,在开启了禁止关机程序的情况下,使用EWX_SHUTDOWN,EWX_POWEROFF都不能关机.只有加上EWX_FORCE这个参数,禁止关机的程序不起作用了.
//关机代码,CMD用 EWX_FORC可以突破禁止关机.
procedure TForm1.CloseWin(cmd:Cardinal);
var
VerInfo:TOSVersionInfo;
hToken:THANDLE;
tkp:TOKEN_PRIVILEGES;
Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
Begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,’SeShutdownPrivilege’,tkp.Privileges[0].Luid);
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
End;
ExitWindowsEx(CMD,0);
end;
最新评论