代碼很少:
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;
?