来自hubdog的‘未加证实的葵花宝典’<br><br>控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数<br>首先定义常数<br>const<br>EWX_FORCE=4; //关闭所有程序并以其他用户身份登录<br>EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式<br>EWX_REBOOT=2; //重新启动计算机<br>EWX_SHUTDOWN=1;//关闭计算机<br>运行时给How赋值,让他等于EWX_SHUTDOWN或其他,调用以下语句<br>ExitWindowsEx(How,0);<br><br>///////////////////////////////////////////<br>Function ShutDownWindows(Flags: Byte) : Boolean;<br>begin<br> Result := ExitWindowsEx(Flage, 0)<br> // 如果成功返回 True.<br>end;<br><br>Flags可用参数:<br><br>EWX_LOGOFF:<br> (=0)<br> 安全地关闭所有进程,并关闭用户登录。<br><br>EWX_SHUTDOWN:<br> (=1)<br> 关闭系统。所有缓冲区的内容都能被安全的存盘,所有进程都将被停止。<br> 对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。<br> 对于Windows 95: 不必有任何特权。<br><br>EWX_REBOOT:<br> (=2)<br> 关闭并重新启动系统。<br> 对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。<br> 对于Windows 95: 不必有任何特权。<br><br>EWX_FORCE:<br> (=4)<br> 强制切断连接,关闭所有应用程序。当使用这个参数时,Windows 将不向正在运行的应用程序发送 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息,有可能造成数据丢失。所以推荐只在紧急时使用这个参数。<br><br>EWX_POWEROFF:<br> (=8)<br> 关闭系统并切断电源,需要ATX电源支持。<br>/////////////////////////////////////<br>unit Unit1;<br><br>interface<br><br>uses<br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br> StdCtrls;<br><br>type<br> TForm1 = class(TForm)<br> Button1: TButton;<br> procedure Button1Click(Sender: TObject);<br><br> private<br> { Private declarations }<br> procedure AdjustToken;<br> public<br> { Public declarations }<br> end;<br><br>var<br> Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.AdjustToken();<br>var<br> hdlProcessHandle : Cardinal;<br> hdlTokenHandle : Cardinal;<br> tmpLuid : Int64;<br> tkpPrivilegeCount : Int64;<br> tkp : TOKEN_PRIVILEGES;<br> tkpNewButIgnored : TOKEN_PRIVILEGES;<br> lBufferNeeded : Cardinal;<br> Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;<br>begin<br> hdlProcessHandle := GetCurrentProcess;<br> OpenProcessToken(hdlProcessHandle,<br> (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),<br> hdlTokenHandle);<br><br> // Get the LUID for shutdown privilege.<br> LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);<br> Privilege[0].Luid := tmpLuid;<br> Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;<br> tkp.PrivilegeCount := 1; // One privilege to set<br> tkp.Privileges[0] := Privilege[0];<br> // Enable the shutdown privilege in the access token of this<br> // process.<br> AdjustTokenPrivileges(hdlTokenHandle,<br> False,<br> tkp,<br> Sizeof(tkpNewButIgnored),<br> tkpNewButIgnored,<br> lBufferNeeded);<br><br> end;<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> AdjustToken;<br> ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF);<br>end;<br><br>end.<br>