我写了一段关机代码,2K的,可以关机,但为什么只能到“你可以安全关机了”的画面,不能关闭电源,这不是还要我手动关机,我的电脑已被我设置成自动关闭电源了。
解决方案 »
- 如何用wordapplication 控件方式 打开word 文档??
- 一个SQL文件有2.68G,SQL查询分析器无法打开。如何一个程序能分批读取并执行呢?
- SQL语句sum问题
- 关于查询的问题,请高手指教(100分相送)
- 在DELPHI和VC做的DLL连起来使用时,出现的问题
- 我将参与远程售票系统的设计开发工作,典型分布式应用,感兴趣的请与我保持联系!
- 如何设定TClientDataSet的DataSetField属性?
- 请问*.Dat格式的文件用什么应用程序打开?
- 这个问题到底怎么解决啊?送所有的分拉!
- Darkness请进(关于Midas)!
- 急问!在线!
- SQL2000 能不能去查询一未知的表?表名时由差数传递的?????
或打开后,将系统-》设备管理器-》计算机-》更新驱动程序-》ACPI....
2,关机时的声音文件丢失。
3,高级电源管理没有ENABLED
4,其它的原因
5,:)
2 CMOS设置支持
3 用Exitwindowsex(ewx_poweroff or ewx_shurdown,0)
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;
var
hProcess,hAccessToken:THandle;
LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
TOKEN_PRIVILEGES: TTokenPrivileges;
BufferIsNull:DWORD;
Const
SE_SHUTDOWN_NAME='SeShutdownPrivilege';
begin
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);
case si of
1:
ExitWindowsEx(EWX_REBOOT, 0); //重启
2:
ExitWindowsEx(EWX_POWEROFF, 0); //关机
end;
ShutDownSystem:=True;
end;
另外:
1 电源至少必须是atx标准
2 CMOS设置支持
3 用Exitwindowsex(ewx_poweroff or ewx_shurdown,0)可以结贴了,希望能对搂主有所帮助!
而在 9x 中只要 ewx_shurdown 即可-----------------------------------
现在混水园了!
ewx_poweroff or ewx_shutdown-----------------------------------
现在混水园了!
var hdlTokenHandle:Cardinal;tmpLuid:TLargeInteger;tkp:TOKEN_PRIVILEGES;lBufferNeeded:Cardinal;
tkpNewButIgnored:TTokenPrivileges;
begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hdlTokenHandle);
LookupPrivilegeValue('','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;
procedure TKStatus.ShutDown;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
hToken:THandle;
tkp:TTokenPrivileges;
tkpo:TTokenPrivileges;
zero:DWORD;
begin
if Pos('Windows NT',GetWinVersion) = 1 then
begin
zero := 0;
if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
begin
Exit;
end;
if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
begin
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
Exit;
end
else
ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0); //ExitWindowsEx(EWX_SHUTDOWN,0); //
end
else
begin
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,0); //ExitWindowsEx(EWX_SHUTDOWN,0); //
end;
end;
WIN98下面EWX_SHUTDOWN就可以了。
真不知道要吵到什么时间~~~~~~~~~
我的机子一个就可以搞定了。