关闭计算机(100分)

  • 主题发起人 主题发起人 txbdir
  • 开始时间 开始时间
T

txbdir

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何禁止强制关闭计算机?
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose :=False;
end;


unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
WantClose: boolean;
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }



{ TForm1 }

procedure TForm1.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_QUERYENDSESSION:
if not WantClose then
exit;
end;
inherited;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WantClose:= true;
end;

end.


上面两种方法都不行!
 
上面的代码是用来禁止关闭计算机的,你怎么用来强制关闭计算机呢?
 
是禁止强制关闭计算机!
 
禁止强制关闭计算机可能只有通过HOOK相关API函数来实现了
 
有没有例子啊?如果有的话,请发一份给我,谢谢,txbdir@163.com
 
咋没有人帮忙呢?哪位大哥帮帮小弟啊!
 
实践证明你的第二种方法是可以禁止关闭计算机,我在xp下测试通过。
不知你使用的是什么环境?你的“禁止强制关闭计算机”中“强制关闭”是指什么?难道是指强行切断电源?
 
第二种情况一般情况下行的,但如果有程序强制关机则就无效了!
 
我的还是WINXP系统!
 
我上次 也是这样写代码
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose :=False;
end
机子关不掉 我还以为中毒了


procedure TForm1.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_QUERYENDSESSION:
if not WantClose then
exit;
end;
inherited;
end;
// application.onMessage:=WndProc 去处理application级的消息
 
“第二种情况一般情况下行的,但如果有程序强制关机则就无效了! ”-能告知“强制关机”的办法吗?我也试试。
 
我就是想禁止强制关机是如何做的!
 
有没有人帮忙啊?
 
各位帮帮忙啊!
 
禁止强制关机?
我按POWER,你咋办呢?
 
LZ说的强制关机是有的,好像是调用API吧,具体忘了,很多定时关机软件就是用的这个来确保关机的可靠性.
Mike1234567890说的应该可行
 
{我把我的测试代码贴出来,给大家一个抛砖引玉吧:
以下代码中调用WinExitInNT(EWX_POWEROFF OR EWX_FORCE );强制关机时窗口根本收不到WM_QUERYENDSESSION, WM_ENDSESSION等事件,而直接关机。
也许把程序权限用AdjustTokenPrivileges函数提高到可以关机的权限后调用ExitWindowsEx后WM_QUERYENDSESSION, WM_ENDSESSION等事件就不触发了,而是直接关机!
好啦,接下来的任务交给钩子高手们,把ExitWindowsEx钩下来!:)
}
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
WantClose: boolean;
procedure WndProc(var Message: TMessage); override;
function SetPrivilege(sPrivilegeName: string;
bEnabled: Boolean): Boolean;
function WinExitInNT(iFlags: Integer): Boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function Tform1.WinExitInNT(iFlags: Integer ):Boolean;
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;

function Tform1.SetPrivilege(sPrivilegeName: string; bEnabled: 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(sPrivilegeName),TP.Privileges[ 0 ].LUID )) then
begin
if(bEnabled) then
begin
TP.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
end else begin
TP.Privileges[ 0 ].Attributes := 0;
end;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token,False,TP,SizeOf( TPPrev ),TPPrev,dwRetLen);
end;
CloseHandle(Token );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WinExitInNT(EWX_POWEROFF OR EWX_FORCE );
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_QUERYENDSESSION, WM_ENDSESSION:
if not WantClose then
exit;
end;
inherited;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WantClose:= true;
end;

end.
 
谢了,我回家试试!
 
man8888,好像还是不行哟!难道真的没有办法了吗?
 
这是不行的,强制关机并不发送关机消息,并且会无条件中止所有程序,钩子是没办法的,目前没有见过有这个功能的软件,如果有的话你可以让盖茨汗颜
 

Similar threads

I
回复
0
查看
540
import
I
I
回复
0
查看
752
import
I
I
回复
0
查看
578
import
I
I
回复
0
查看
526
import
I
后退
顶部