你试试。unit Unit1;interfaceuses
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.
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.
解决方案 »
- delphi的usb通信问题
- 在使用了TXPManifest后,ComboBox内容删除的问题
- 看看这段代码,提示abstract error 错误,请教是什么原因?
- BDE TQuery 查询数据库 无结果
- 调试中不能查看变量内容,是什么原因?
- 祝大家中秋快乐吧~~~
- 一个简单又奇怪的问题!!!
- adotable设了master/detail 如何取消,我要对adotable使用filter 100分
- 问两个socket编程的问题(刚开始socket编程的)
- 一个全新的Delphi6问题
- DELPHY编的数据库应用程序在运行时需要哪些相关的文件(当前机器没安装DELPHY),它
- 请教问题?关于Delphi输出字符串的问题,请指教:
EWX_POWEROFF:关闭计算机,关闭电源.
EWX_SHUTDOWN:关闭计算机,出现关机画面.
EWX_REBOOT:重新启动.
EWX_LOGOUT:注销用户.
EWX_FORCE:强制退出.
令人奇怪的是EWX_POWER关闭不了计算机.仅仅是注销而已.组合EWX_FORCE也不管用.反而是EWX_SHUTDOWN能关闭计算机.当时没怎没在意,后来在Experts-exchange上看到有人也碰到类似问题.有个鬼子解答说可能是MICROSOFT的Bugs,并且EWX_FORCE只能配合EWX_LOGOUT使用,配合其他的选项可能会是WINDOWS迷惑导致错乱.
如果ExitWindowsEx(EWX_SHUTDOWN,0)关不掉你的计算机.建议你跟微软接受Bug报告的部门联系.
到时别忘的把微软的解释告诉大家就是了.
那就是:
你是不是用了xxUDP控件,
使用的UDP协议
procedure exitwin(var msg:TWMQUERYENDSESSION);message WM_QUERYENDSESSION;
procedure TForm1.exitwin(var msg: TWMQUERYENDSESSION); //关机处理过程
begin
inherited;
Form1.Close;
end;
我对此很感兴趣。谢谢