在win2000的环境下运行后,可以出现“可以安全的关闭计算机了”的画面,
却无法关闭机箱电源。为什么不能像os里关机一样,同时关闭机箱电源呢?procedure TForm1.Shutdown();
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
end;
ExitWindowsEx(EWX_SHUTDOWN,0);
end;
却无法关闭机箱电源。为什么不能像os里关机一样,同时关闭机箱电源呢?procedure TForm1.Shutdown();
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
end;
ExitWindowsEx(EWX_SHUTDOWN,0);
end;
解决方案 »
- 请问一下Delphi的工具栏摆放问题
- access数据表 select查询的问题,具体在贴内
- 关于ADOTable中的Refresh
- 那有免费的电子图书下载?
- 新鲜免费的“兼职”小弟,不要也来看看呀!(天津)
- 错在那里showmessage(FormatFloat('#.00',[edit1.text])
- 在2000下编译的程序在98上运行时,窗口变的很大,而且窗口上的控件也都变大了。
- 用ADOTABLE+DBGRID连数据库,怎样使有些字段不在DBGRID中显示出来?
- 那位高手能帮我,谢谢!
- C/S数据库一个既简单有麻烦的问题。请求高手对我畅开心扉 ^_^ (我只有23分 7_7)
- 求delphi5企业版下载。100分了。急呀!!!!!!!!!
- 哪里有delphi6完整版下载啊!
EWX_SHUTDOWN 参数只是使WINDOWS关闭所有的程序,使系统处在可关机状态。
应该使用:EWX_POWEROFF 参数,这样,在ATX的机器上可以直接的关闭电源!即,将最后一句改为:
ExitWindowsEx(EWX_POWEROFF,0);
procedure shutdown(ReBoot: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;
begin
OpenProcessToken(GetCurrentProcess, ADJUST_PRIV, Token);
LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid);
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1;
AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len);
InitiateSystemShutDown(nil,nil,0,True,Reboot);
end;
Forms, System, Windows;{$R *.res}var
hProcess,hAccessToken:THandle;
BufferIsNull:DWORD;
LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
TOKEN_PRIVILEGES: TTokenPrivileges;const
SE_SHUTDOWN_NAME='SeShutdownPrivilege';begin
Application.Initialize;
Application.Run;
hProcess:=GetCurrentProcess();
OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);
LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;
TOKEN_PRIVILEGES.PrivilegeCount:=1;
TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;
BufferIsNull:=0;
AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVILEGES),Nil,BufferIsNull);
ExitWindowsEx(EWX_POWEROFF, 0);
end.必然好用,只是功能简单了...