itljl 发表于 2009-7-25 15:43:27

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键运行程序。只要本程序在正常运行,用户就无法关闭操作系统。

rolaka 发表于 2009-7-25 15:45:08

好像autoit不给脚本处理这个WM_QueryEndSession...

楼下继续...我是用WM_QueryEndSession的失败者...

itljl 发表于 2009-7-25 15:47:44

为什么不让处理...

pusofalse 发表于 2009-7-25 15:49:14

好像可以通过移除用户的关机权限来阻止关闭系统。对应组策略用户权利指派中的关闭系统。但需要重启或注销。

rolaka 发表于 2009-7-25 16:02:20

为什么不让处理...
itljl 发表于 2009-7-25 15:47 http://www.autoitx.com/images/common/back.gif
表问我 问autoit去 我从来都没有成功拦截到这个消息

ceoguang 发表于 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

破帽遮颜 发表于 2009-7-27 01:37:55

马甲的确实能行?牛~~~
明天找xp系统试试看先~

lynfr8 发表于 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)
    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:03:25

本帖最后由 lynfr8 于 2009-7-27 03:05 编辑

马甲的代码可行
它在关闭所有用户运行的程序之后就会弹出提示
大家可以放心测试下

bbip 发表于 2009-7-27 12:25:26

阻止关机?

pusofalse 发表于 2009-7-27 14:17:44

奇怪,我测试7#的代码,还是关机了。不知各位是怎样测试的,我的测试:开始-->关闭计算机-->关机,结果7#的代码没任何反应就关机了。测试环境WinXP SP3。

afan 发表于 2009-7-27 14:43:45

奇怪,我测试7#的代码,还是关机了。不知各位是怎样测试的,我的测试:开始-->关闭计算机-->关机,结果7#的代码没任何反应就关机了。测试环境WinXP SP3。
pusofalse 发表于 2009-7-27 14:17 http://www.autoitx.com/images/common/back.gif

一样,同条件同结果~~

landays 发表于 2009-7-27 14:47:52

测试成功!系统是WinXP SP3

lynfr8 发表于 2009-7-27 14:49:41

测试成功!系统是WinXP SP3
landays 发表于 2009-7-27 14:47 http://www.autoitx.com/images/common/back.gif

一样,同条件同结果~~
页: [1] 2 3
查看完整版本: Delphi编程禁止用户关闭操作系统