关机与禁止关机代码
代碼很少:
private
?????? procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;
procedure TForm1.QueryEndSession(var Msg:TMessage);
begin
? Msg.Result:=0;
end;
就是收到關(guān)機消息后返回0,告知還不能關(guān)機.
而定時關(guān)機這邊主要是用這條API指令來關(guān)機:
? BOOL?? ExitWindowsEx(??
? UINT?? uFlags,?? //?? 關(guān)閉操作??
? DWORD?? dwReserved?? //?? 保留,0即可.??
)?? ;??
其中參數(shù)uFlags的取值及其含義:??
EWX_FORCE?? 在緊急情況下強制關(guān)機。??
EWX_LOGOFF?? 以其他用戶身份登錄。??
EWX_POWEROFF?? 關(guān)閉系統(tǒng)并關(guān)閉電源。??
EWX_REBOOT?? 重新啟動。??
EWX_SHUTDOWN?? 安全地關(guān)機。?
測試了一下,在開啟了禁止關(guān)機程序的情況下,使用EWX_SHUTDOWN,EWX_POWEROFF都不能關(guān)機.只有加上EWX_FORCE這個參數(shù),禁止關(guān)機的程序不起作用了.
//關(guān)機代碼,CMD用 EWX_FORC可以突破禁止關(guān)機.
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;
?
轉(zhuǎn)載于:https://www.cnblogs.com/hssbsw/archive/2012/06/03/2533101.html
總結(jié)
- 上一篇: 如何学习Linux / 新手入门
- 下一篇: 如何给FormPanel表单中的元素赋值