反强制关机 ( 积分: 100 )

  • 主题发起人 主题发起人 jordie
  • 开始时间 开始时间
J

jordie

Unregistered / Unconfirmed
GUEST, unregistred user!
请知道的朋友指点一下如何禁止强制关机,如:
//////////////////////////////////////////////////////////////////////
function ShutDown(uFlags:Cardinal):boolean; //开始winnt下的强迫关机
const
ADjust_Priv=Token_Query or Token_Adjust_Privileges;
ShtDwn_Priv='SeShutDownPrivilege';
Priv_Size=Sizeof(TTokenPrivileges);
var
Len:Dword;
TokenPriv,Dummy:TTokenPrivileges;
Token:THandle;
Error:integer;
begin
Error:=0;
if not OpenProcessToken(GetCurrentProcess(),Adjust_Priv,Token) then
Error:=Error or 4;
if not LookUpPrivilegeValue(nil,ShtDwn_Priv,TokenPriv.Privileges[0].Luid) then
Error:=Error or 8;
TokenPriv.Privileges[0].Attributes:=Se_Privilege_Enabled;
TokenPriv.PrivilegeCount:=1; //设置一个权限
if not AdjustTokenPrivileges(Token,false,TokenPriv,Priv_Size,Dummy,Len) then
Error:=Error or 16;
ExitWindowsEx(uFlags,0);
Result:=(Error=0);
end; //结束强迫关机过程

ShutDown(Ewx_PowerOff+Ewx_Force);
//////////////////////////////////////////////////////////////////
以这样的代码写的软件。
请给个思路或代码。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=405532
Windows 在关机之前都作什么了,我该怎么加入自己的程序呢?

David Jiang (2000-11-28 19:53:00)
首先要了解Windows的关机的程序。当用户退出Windows时,Windows系统会给每个Top-level的窗体发WM_QUERYENDSESSION 的系统消息,查询能否关机,窗体可在接到此消息时进行结束前的工作(如编辑类的窗体会提示未保存的文件存盘等),窗体返回TRUE为同意关机,FALSE为不同意关机。
Windows9x等所有的窗体都回应了WM_QUERYENDSESSION后,系统会再发WM_ENDSESSION的消息,消息的wparam 参数为是否结束Windows,若TRUE,窗体要马上结束程序,若FALSE则取消关闭Windows的命令,窗体可以照常工作。只要某一窗体在WM_QUERYENDSESSION返回FALSE(不同意关机),WM_ENDSESSION的wparam即为FALSE。而在Windows NT/2000窗体返回WM_QUERYENDSESSION后马上接到WM_ENDSESSION的消息,不用等其它窗体对WM_QUERYENDSESSION的回应。不管在9x、Nt和2000,各Top-level的窗体都可以“一票否决”取消关闭Windows的命令,这样可以确保应用程序的数据不会丢失。

自己的程序可以捕捉上述的两个消息.
 
type
TForm1 = class(TForm)
private
procedure WMQueryEndSession(var aMessage: TWMQueryEndSession); message WM_QUERYENDSESSION;
...
procedure TForm1.WMQueryEndSession(var aMessage: TWMQueryEndSession);
begin
aMessage.Result:=0; //取消关机
ShowMessage('对不起,你没有关机的权限!');
end;
 
强制关机时不能捕获到楼上的消息
 
http://free.ys168.com/?58822 里面有个拦截关机的 你试下
看看 是不是你要的那样效果
 
XP下就是WM_QUERYENDSESSION这个消息,而且这个消息有一票否决权,只要有任意一个进程返回False,就可以阻止关机。
我的源码(已经测试,XP+SP2下能用):
unit CutShutDown;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMQueryEndSession(var aMessage: TWMQueryEndSession); message WM_QUERYENDSESSION;

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMQueryEndSession(var aMessage: TWMQueryEndSession);
begin
aMessage.Result:=0; //取消关机
ShowMessage('对不起,你没有关机的权限!');
end;

end.
 
我发现如果建个程序,在onclosequery设置cancloe=false系统就关不了机了
 
多人接受答案了。
 
后退
顶部