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