function TForm1.ShutDown(uFlags: Cardinal): Boolean;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);
var
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Error: integer;
begin
Error:= 0;
// 设置特权
if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
Error:= Error or 4;
if not LookupPrivilegeValue(nil, SHTDWN_PRIV, TokenPriv.Privileges[0].Luid) then
Error:= Error or 8;
TokenPriv.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount:= 1; // One privilege to set
if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE, Dummy, Len) then
Error:= Error or 16;
ExitWindowsEx(uFlags, 0);
Result:= (Error = 0);
end;
关机时只要调用函数
ShutDown(EWX_POWEROFF + EWX_FORCE);
当然要把程序设成自启动