Delphi编程禁止用户关闭操作系统
au3中也能实现吗?下面是在delphi中实现用户是否可以关闭操作系统是通过对WM_QueryEndSession的处理来实现的,为此首先需要在程序中添加
WM_QueryEndSession消息处理的声明:
procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;
它的响应代码如下:
procedure TForm1.QueryEndSession(var Msg:TMessage);
begin
Msg.Result:=0;
end;
当用户关闭操作系统时,操作系统会发布一个WM_QueryEndSession消息,这时就会激活本实例程序中
的QueryEndSession过程,程序通过设置消息的返回值为0,就会禁止用户关闭操作系统,反之如果设置消
息的返回值为1,就会允许用户关闭操作系统。
程序代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.QueryEndSession(var Msg:TMessage);
begin
Msg.Result:=0;
end;
end.
保存文件,然后按F9键运行程序。只要本程序在正常运行,用户就无法关闭操作系统。 好像autoit不给脚本处理这个WM_QueryEndSession...
楼下继续...我是用WM_QueryEndSession的失败者... 为什么不让处理... 好像可以通过移除用户的关机权限来阻止关闭系统。对应组策略用户权利指派中的关闭系统。但需要重启或注销。 为什么不让处理...
itljl 发表于 2009-7-25 15:47 http://www.autoitx.com/images/common/back.gif
表问我 问autoit去 我从来都没有成功拦截到这个消息 关注此贴,帮顶........ $WM_QUERYENDSESSION = 0x0011
GUIRegisterMsg($WM_QUERYENDSESSION, "Cancel")
GUICreate("")
GUISetSTate(@SW_HIDE)
Global $Esc = 0
While 1
If $Esc = 1 then
MsgBox (0, "", "想干什么!按确定后继续截获")
$Esc = 0
EndIf
sleep(10)
WEnd
Func Cancel($hWndGUI, $MsgID, $WParam, $LParam)
$Esc = 1
Return False
EndFunc 马甲的确实能行?牛~~~
明天找xp系统试试看先~ 之前试过挂起winlogon进程来阻止关机
不过有时候可以有时不可以
甚至试过导致系统崩溃
不是很稳定
有兴趣的可以自行测试一下$process='winlogon.exe'
_ProcessSuspend($process)
MsgBox('','','已经挂起'&$process&@CRLF&'10秒之内无法关机!')
Sleep(10000)
_ProcessResume($process)
MsgBox('','','已经恢复'&$process&@CRLF&'又可以关机了!')
Func _ProcessSuspend($process)
$processid = ProcessExists($process)
If $processid Then
$ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
$i_sucess = DllCall("ntdll.dll","int","NtSuspendProcess","int",$ai_Handle)
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
If IsArray($i_sucess) Then
Return 1
Else
SetError(1)
Return 0
Endif
Else
SetError(2)
Return 0
Endif
EndFunc
Func _ProcessResume($process)
$processid = ProcessExists($process)
If $processid Then
$ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
$i_sucess = DllCall("ntdll.dll","int","NtResumeProcess","int",$ai_Handle)
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
If IsArray($i_sucess) Then
Return 1
Else
SetError(1)
Return 0
Endif
Else
SetError(2)
Return 0
Endif
EndFunc 本帖最后由 lynfr8 于 2009-7-27 03:05 编辑
马甲的代码可行
它在关闭所有用户运行的程序之后就会弹出提示
大家可以放心测试下 阻止关机? 奇怪,我测试7#的代码,还是关机了。不知各位是怎样测试的,我的测试:开始-->关闭计算机-->关机,结果7#的代码没任何反应就关机了。测试环境WinXP SP3。 奇怪,我测试7#的代码,还是关机了。不知各位是怎样测试的,我的测试:开始-->关闭计算机-->关机,结果7#的代码没任何反应就关机了。测试环境WinXP SP3。
pusofalse 发表于 2009-7-27 14:17 http://www.autoitx.com/images/common/back.gif
一样,同条件同结果~~ 测试成功!系统是WinXP SP3 测试成功!系统是WinXP SP3
landays 发表于 2009-7-27 14:47 http://www.autoitx.com/images/common/back.gif
一样,同条件同结果~~