实现打开程序自动关机:
需要用到的函数
BOOL ExitWindowsEx( UINT uFlags, // 关闭参数 DWORD dwReserved // 系统保留,一般取0 );
uFlags | 说明 |
EWX_FORCE | 强制终止进程。 |
EWX_LOGOFF | 关闭所有进程,然后注销用户。 |
EWX_POWEROFF | 关闭系统并关闭电源。该系统必须支持断电。 |
EWX_REBOOT | 关闭系统,然后重新启动系统。 |
EWX_SHUTDOWN | 关闭系统,安全地关闭电源。所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。 |
(Windows要求:Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。Windows 9X中:可以直接调用。)
delphi代码实现:
procedure TForm1.FormCreate(Sender: TObject); begin Shutdown; end; function TForm1.GetShutdownRoot:Boolean; var myhandle:THandle; //返回句柄 myprivilege:TOKEN_PRIVILEGES; //Luid and privilege数组 myluid:Int64; //luid buff:Cardinal; begin Result:=False; //打开进程关联的访问令牌 if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,myhandle) then Result:=False; //设置一个关机权限,获取luid if not LookupPrivilegeValue(nil,‘SeShutdownPrivileges‘,myluid) then Result:=False; myprivilege.PrivilegeCount:=1; //指定特权数组个数为1 myprivilege.Privileges[0].Luid:=myluid; myprivilege.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; //特权启用 //通知操作系统特权为打开状态 AdjustTokenPrivileges(myhandle,False,myprivilege,SizeOf(myprivilege),nil,buff); if not CloseHandle(myhandle) then Result:=False; //关闭句柄对象 Result:=True; end; procedure TForm1.Shutdown; begin if not GetShutdownRoot then ShowMessage(‘获得关机权限失败‘); if not ExitWindowsEx(EWX_SHUTDOWN,0) then ShowMessage(‘关机失败!‘); //关机 end;