2009-10-16 | #1 (permalink) |
高级会员
注册日期: 2009-07-09
住址: 亦庄经济开发区2号院大族广场1502
帖子: 531
|
delphi直接重启api
控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数
首先定义常数 const EWX_FORCE=4; //关闭所有程序并以其他用户身份登录 EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式 EWX_REBOOT=2; //重新启动计算机 EWX_SHUTDOWN=1;//关闭计算机 运行时给How赋值,让他等于EWX_SHUTDOWN或其他,调用以下语句 ExitWindowsEx(How,0); /////////////////////////////////////////// Function ShutDownWindows(Flags: Byte) : Boolean; begin Result := ExitWindowsEx(Flage, 0) // 如果成功返回 True. end; Flags可用参数: EWX_LOGOFF: (=0) 安全地关闭所有进程,并关闭用户登录。 EWX_SHUTDOWN: (=1) 关闭系统。所有缓冲区的内容都能被安全的存盘,所有进程都将被停止。 对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。 对于Windows 95: 不必有任何特权。 EWX_REBOOT: (=2) 关闭并重新启动系统。 对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。 对于Windows 95: 不必有任何特权。 EWX_FORCE: (=4) 强制切断连接,关闭所有应用程序。当使用这个参数时,Windows 将不向正在运行的应用程序发送 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息,有可能造成数据丢失。所以推荐只在紧急时使用这个参数。 EWX_POWEROFF: (=8) 关闭系统并切断电源,需要ATX电源支持。 ///////////////////////////////////// unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure AdjustToken; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.AdjustToken(); var hdlProcessHandle : Cardinal; hdlTokenHandle : Cardinal; tmpLuid : Int64; tkpPrivilegeCount : Int64; tkp : TOKEN_PRIVILEGES; tkpNewButIgnored : TOKEN_PRIVILEGES; lBufferNeeded : Cardinal; Privilege : array[0..0] of _LUID_AND_ATTRIBUTES; begin hdlProcessHandle := GetCurrentProcess; OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle); // Get the LUID for shutdown privilege. LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid); Privilege[0].Luid := tmpLuid; Privilege[0].Attributes := SE_PRIVILEGE_ENABLED; tkp.PrivilegeCount := 1; // One privilege to set tkp.Privileges[0] := Privilege[0]; // Enable the shutdown privilege in the access token of this // process. AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Sizeof(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded); end; procedure TForm1.Button1Click(Sender: TObject); begin AdjustToken; ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF); end; end. ///////////////////// Function TFrmBootSys.My_ExitWindows(M_1Reboot_2Power: integer): Boolean; var hToken: THANDLE; hProc: THANDLE; mLUID: TLargeInteger; mPriv, mNewPriv: TOKEN_PRIVILEGES; mBufferLength: DWord; begin Result:=false; if not (M_1Reboot_2Power in [1, 2]) then exit; hProc := GetCurrentProcess(); OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken); LookupPrivilegeValue('', 'SeShutdownPrivilege', mLUID); mPriv.PrivilegeCount := 1; mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; mPriv.Privileges[0].Luid := mLUID; AdjustTokenPrivileges(hToken, False, mPriv, (4 + (12 * mPriv.PrivilegeCount)), mNewPriv, mBufferLength); GetLastError; case M_1Reboot_2Power of 1: Result := ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0); 2: Result := ExitWindowsEx(EWX_FORCE+EWX_POWEROFF, 0); end; end; ///////////////// ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE or EWX_POWEROFF), $FFFF); ////////////////// win 2000 下 试试 : 关机 ExitWindowsEx(EWX_POWEROFF, 0);
__________________
地址:北京亦庄经济技术开发区荣华南路10号院5号楼705 电话:010-82356575/76/77转6070 联系人:苏秋英 手机微信同号:13811870548 QQ: 1170923055 |