win2000的关机(20分)

  • 主题发起人 主题发起人 darkblood
  • 开始时间 开始时间
D

darkblood

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi6编的程序
里面有关机语句
ExitWindowsex(EWX_SHUTDOWN,0)
但是点击按钮后没有反应,用ExitWindowsex(EWX_POWEROFF,0)也不行

为什么?应该怎么写?
 
你用ExitWindowsEx(1,0) OR ExitWindows(1,0) 能实现吗?
 
控制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.
 
调用API函数ExitWindowsEx可以首先重新驱动和关机。ExitWindowsEx定义如下:
BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);
其中uFlags菜单决定关机的方式,EWX_REBOOT表示重新启动,EWX_SHUTDOWN表示关机,EWX_POWEROFF表示关闭电源(主板需为ATX结构)。
如果是在Windows NT下,需要修改优先级,修改的方法参考:QA000166 "如何利用vb实现操作系统或者某一应用程序的自动关闭"。
你需要在uFlags参数中加上EWX_POWEROFF(EWX_POWEROFF = 8),如:
ExitWindows(EWX_SHUTDOWN | EWX_POWEROFF, 0);

 
实现不了
 
procedure TfrmTime.AdjustTokenPrivilegesNT();
var
hdlProcessHandle:cardinal;
hdlTokenHandle:cardinal;
tmpLuid:int64;
tkp:TOKEN_PRIVILEGES;
tkpNewButIgnored:TOKEN_PRIVILEGES;
lBufferNeeded:cardinal;
begin
hdlProcessHandle:=GetCurrentProcess();
OpenProcessToken(hdlProcessHandle,
TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY,
hdlTokenHandle);

LookupPrivilegeValue(pChar(''),pChar('SeShutdownPrivilege'),tmpLuid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Luid := tmpLuid;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hdlTokenHandle, False, tkp,
sizeof(tkpNewButIgnored), tkpNewButIgnored,
lBufferNeeded);
end;

 
后退
顶部