imnebula 发表于 2011-2-8 23:20:23

autoit写的程序能监听到关机或登出时的消息吗?WM_QUERYENDSESSION,WM_ENDSESSION

在窗体对象中有俩个重要的消息:WM_QUERYENDSESSION,WM_ENDSESSION,这俩个消息在关机或登出时系统自动发生到每个窗体对象上

这个东西在AUTOIT里,我们能监听到吗?就是说我的程序能收到即将要关机或登出的消息吗?

republican 发表于 2011-2-9 00:33:56

我只能说,肯定可以……

ceoguang 发表于 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(
__inDWORD dwLevel,
__inDWORD 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

wsfda 发表于 2011-2-9 18:33:07

学习了,支持

masterpcc 发表于 2011-2-9 19:55:03

谢谢分享!

imnebula 发表于 2011-2-10 22:42:21

回复 3# ceoguang

谢谢您!~~

这个确实能够监听到。不过似乎 用了这个。之后 的代码 就没有办法 运行了。也就是说不能同时监听同时运行其他 的代码是吗?有办法同时 监听 和运行其他 的代码 吗?

imnebula 发表于 2011-2-11 01:29:00

回复 3# ceoguang
win7 下好像没用

ceoguang 发表于 2011-2-11 14:33:26

win7下是有效的,只是你看不到而已,因为会强制关闭

卫和谐 发表于 2011-2-11 18:02:22

正好用得到,非常感谢!

ywq111 发表于 2011-2-11 18:21:01

不错。发现好东西

卫和谐 发表于 2011-2-12 10:58:24

回复 8# ceoguang


忘记请教了,WIN7是的可以收到消息,但如何不让WIN7强制关机,也就是不让电脑回应呢?

卫和谐 发表于 2011-2-12 20:41:11

顶一下,知道的朋友说一下~~~

pusofalse 发表于 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系统。

republican 发表于 2011-2-15 18:39:14

回复 13# pusofalse

2003 测试成功。

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

pusofalse 发表于 2011-2-15 19:00:23

回复 14# republican


    谢谢帮忙测试。果真有很多不足,只是现在还不能够修复它。
页: [1] 2
查看完整版本: autoit写的程序能监听到关机或登出时的消息吗?WM_QUERYENDSESSION,WM_ENDSESSION