找回密码
 加入
搜索
查看: 8646|回复: 15

[系统综合] autoit写的程序能监听到关机或登出时的消息吗?WM_QUERYENDSESSION,WM_ENDSESSION

 火.. [复制链接]
发表于 2011-2-8 23:20:23 | 显示全部楼层 |阅读模式
在窗体对象中有俩个重要的消息:WM_QUERYENDSESSION,WM_ENDSESSION,这俩个消息在关机或登出时系统自动发生到每个窗体对象上

这个东西在AUTOIT里,我们能监听到吗?就是说我的程序能收到即将要关机或登出的消息吗?
发表于 2011-2-9 00:33:56 | 显示全部楼层
我只能说,肯定可以……
发表于 2011-2-9 14:07:15 | 显示全部楼层

;http://msdn.microsoft.com/en-us/library/ms686227(v=vs.85).aspx
DllCall("Kernel32", "ubyte", "SetProcessShutdownParameters", "dword", 1024, "dword", 1) ;更改关机级别 0 - 1024 级别越高程序在系统关闭时越早关闭
#cs
BOOL WINAPI SetProcessShutdownParameters(
  __in  DWORD dwLevel,
  __in  DWORD dwFlags
);
#ce

;http://msdn.microsoft.com/en-us/library/aa376889(v=vs.85).aspx
;http://msdn.microsoft.com/en-us/library/aa376890(v=vs.85).aspx

GUIRegisterMsg(0x0011, "WindowProc")
GUIRegisterMsg(0x0016, "WindowProc")

#cs
#define WM_QUERYENDSESSION 0x0011
#define WM_ENDSESSION 0x0016
#ce

#cs
LRESULT CALLBACK WindowProc( 
  HWND hwnd,      // handle to window 
  UINT uMsg,      // message identifier 
  WPARAM wParam,  // not used 
  LPARAM lParam   // logoff option
);
#ce

GUICreate("test")
$Edit = GUICtrlCreateEdit("", 50, 35, 300, 330)

GUISetSTate()
Do
Until GUIGetMsg() = -3

Func WindowProc($hWnd, $MsgID, $WParam, $LParam)
        GUICtrlSetData($Edit,GUICtrlRead($Edit) & "Time: " & StringFormat("%2d:%2d:%2d",@HOUR,@MIN,@SEC) & @CRLF& "Msg: 0x" & Hex($MsgID) & @CRLF& "LParam: 0x" & Hex($LParam) & @CRLF)
    Return False
EndFunc

评分

参与人数 1贡献 +5 收起 理由
lixiaolong + 5 谢谢分享,Win7下无法阻止

查看全部评分

发表于 2011-2-9 18:33:07 | 显示全部楼层
学习了,支持
发表于 2011-2-9 19:55:03 | 显示全部楼层
谢谢分享!
 楼主| 发表于 2011-2-10 22:42:21 | 显示全部楼层
回复 3# ceoguang

谢谢您!~~

这个确实能够监听到。不过似乎 用了这个。之后 的代码 就没有办法 运行了。也就是说不能同时监听同时运行其他 的代码是吗?有办法同时 监听 和运行其他 的代码 吗?
 楼主| 发表于 2011-2-11 01:29:00 | 显示全部楼层
回复 3# ceoguang
win7 下好像没用
发表于 2011-2-11 14:33:26 | 显示全部楼层
win7下是有效的,只是你看不到而已,因为会强制关闭
发表于 2011-2-11 18:02:22 | 显示全部楼层
正好用得到,非常感谢!
发表于 2011-2-11 18:21:01 | 显示全部楼层
不错。发现好东西
发表于 2011-2-12 10:58:24 | 显示全部楼层
回复 8# ceoguang


忘记请教了,WIN7是的可以收到消息,但如何不让WIN7强制关机,也就是不让电脑回应呢?
发表于 2011-2-12 20:41:11 | 显示全部楼层
顶一下,知道的朋友说一下~~~
发表于 2011-2-15 17:03:24 | 显示全部楼层
#include <RTApiHook32.au3>

$hProcess = _RTOpenProcess("explorer.exe")
If ($hProcess < 1) Then
        Exit MsgBox(0x40030, "Error", "Error opening process: " & @error)
EndIf

$pExitWindowsEx = _RTGetProcAddress("User32.dll", "ExitWindowsEx")
If ($pExitWindowsEx = 0) Then
        Exit MsgBox(0x40030, "Error", "Error finding system function.")
EndIf

$hCallBack = DllCallBackRegister("_CallBack", "long", "handle;ptr")
$pCallBack = DllCallBackGetPtr($hCallBack)

$tExitWindowsEx = _RTApiHookEx($hProcess, $pExitWindowsEx, 2, $pCallBack)
If ($tExitWindowsEx = 0) Then
        Exit MsgBox(0x40030, "Error", "Error hooking system function: " & @error)
EndIf

OnAutoItExitRegister("_Restore")
While 1
        Sleep(100)
WEnd

Func _Restore()
        _RTApiUnhook($hProcess, $pExitWindowsEx, DllStructGetData($tExitWindowsEx, "Entrypoint"))
        _RTCloseHandle($hProcess)
EndFunc        ;==>_Restore

Func _CallBack($hProcess, $pCallInfo)
        Local $iFlags, $iReason

        $iFlags = _RTApiHookReadParam($hProcess, $pCallInfo, 1)
        $iReason = _RTApiHookReadParam($hProcess, $pCallInfo, 2)

        MsgBox(48, $iFlags, $iReason)

        Return $APIHOOK_Flags_Call_Abort
EndFunc        ;==>_CallBack


挂钩ExitWindowsEx函数。顺便帮我测试一下,看这段代码能否运行于WIN7系统。

评分

参与人数 1贡献 +5 收起 理由
lixiaolong + 5 谢谢分享

查看全部评分

发表于 2011-2-15 18:39:14 | 显示全部楼层
回复 13# pusofalse

2003 测试成功。

08 R2 32位编译无法挂钩;64位编译直接崩溃。

评分

参与人数 1金钱 +20 收起 理由
pusofalse + 20 感谢测试。

查看全部评分

发表于 2011-2-15 19:00:23 | 显示全部楼层
回复 14# republican


    谢谢帮忙测试。果真有很多不足,只是现在还不能够修复它。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 02:28 , Processed in 0.082552 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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