找回密码
 加入
搜索
查看: 8070|回复: 35

Delphi编程禁止用户关闭操作系统

[复制链接]
发表于 2009-7-25 15:43:27 | 显示全部楼层 |阅读模式
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键运行程序。只要本程序在正常运行,用户就无法关闭操作系统。 
发表于 2009-7-25 15:45:08 | 显示全部楼层
好像autoit不给脚本处理这个WM_QueryEndSession...

楼下继续...我是用WM_QueryEndSession的失败者...
 楼主| 发表于 2009-7-25 15:47:44 | 显示全部楼层
为什么不让处理...
发表于 2009-7-25 15:49:14 | 显示全部楼层
好像可以通过移除用户的关机权限来阻止关闭系统。对应组策略用户权利指派中的关闭系统。但需要重启或注销。
发表于 2009-7-25 16:02:20 | 显示全部楼层
为什么不让处理...
itljl 发表于 2009-7-25 15:47

表问我 问autoit去 我从来都没有成功拦截到这个消息
发表于 2009-7-26 18:52:19 | 显示全部楼层
关注此贴,帮顶........
发表于 2009-7-27 00:52:46 | 显示全部楼层
$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

评分

参与人数 1金钱 +4 收起 理由
lynfr8 + 4 代码安全可行!

查看全部评分

发表于 2009-7-27 01:37:55 | 显示全部楼层
马甲的确实能行?牛~~~
明天找xp系统试试看先~
发表于 2009-7-27 02:59:46 | 显示全部楼层
之前试过挂起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[0])
    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[0])
    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
发表于 2009-7-27 03:03:25 | 显示全部楼层
本帖最后由 lynfr8 于 2009-7-27 03:05 编辑

马甲的代码可行
它在关闭所有用户运行的程序之后就会弹出提示
大家可以放心测试下
发表于 2009-7-27 12:25:26 | 显示全部楼层
阻止关机?
发表于 2009-7-27 14:17:44 | 显示全部楼层
奇怪,我测试7#的代码,还是关机了。不知各位是怎样测试的,我的测试:开始-->关闭计算机-->关机,结果7#的代码没任何反应就关机了。测试环境WinXP SP3。
发表于 2009-7-27 14:43:45 | 显示全部楼层
奇怪,我测试7#的代码,还是关机了。不知各位是怎样测试的,我的测试:开始-->关闭计算机-->关机,结果7#的代码没任何反应就关机了。测试环境WinXP SP3。
pusofalse 发表于 2009-7-27 14:17


一样,同条件同结果~~
发表于 2009-7-27 14:47:52 | 显示全部楼层
测试成功!系统是WinXP SP3
发表于 2009-7-27 14:49:41 | 显示全部楼层
测试成功!系统是WinXP SP3
landays 发表于 2009-7-27 14:47


一样,同条件同结果~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 02:29 , Processed in 0.099961 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表