2000下如何编程关闭电源?(50分)

  • 主题发起人 主题发起人 songhb
  • 开始时间 开始时间
S

songhb

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。
ATX主板,给出完整代码即送分。
 
调用ExitWindowEx函数,但是2000下面先要调用AdjustTokenPrivileges获取关机的特权
给你一段别人的代码吧,调用WinExit(EWX_SHUTDOWN)就行了

function SetPrivilege(aPrivilegeName : string;
aEnabled : boolean ): boolean;
var
TPPrev,
TP : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, Token );

TP.PrivilegeCount := 1;
if( LookupPrivilegeValue(nil, PChar( aPrivilegeName ),
TP.Privileges[ 0 ].LUID ) ) then
begin
if( aEnabled )then
TP.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED
else
TP.Privileges[0].Attributes:= 0;

dwRetLen := 0;
Result := AdjustTokenPrivileges(Token,False,TP,
SizeOf( TPPrev ),
TPPrev,dwRetLen );
end;

CloseHandle( Token );
end;

function WinExit( iFlags : integer ) : boolean;
// possible Flags:
// EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
begin
Result := True;
if( SetPrivilege( 'SeShutdownPrivilege', true ) ) then
begin
if( not ExitWindowsEx( iFlags, 0 ) )then
begin
Result := False;
end;
SetPrivilege( 'SeShutdownPrivilege', False )
end
else
begin
Result := False;
end;
end;
 
to crystal:
我试过了,我调用时执行winexit(EWX_POWEROFF);但系统并未关机,而是重启了,
请指教。
 
procedure TShutDownComputer.ShutDownComputer;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
begin
zero:=0;
if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
then begin
MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
Exit;
end;

if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
then begin
MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
Exit;
end;

if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid )
then begin
MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );
Exit;
end;

tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );

if Boolean( GetLastError() )
then begin
MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );
Exit;
end
else ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
 
看我以前回答过的一个问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=565798
 
我按以上几位的方法试过,但都是重新启动,没有关闭电源。
现象是电源关闭了,但马上又打开了。
我试了几台不同配置的机器,都是如此,
这是什么原因,请指教!
 
启动的时候按Del键进入CMOS设置,有一项选项是(好像叫After power off)设置为
Resume XXX...(记不得啦)的时候会出现这种状况,代码应该是没问题的吧。检查一下
CMOS设置。
 
我查过了,我的CMOS设置是正常的,而且有ME下是可以关闭电源的。
 
那我就不知道啦,抱歉
 
后退
顶部