autoit写的程序能监听到关机或登出时的消息吗?WM_QUERYENDSESSION,WM_ENDSESSION
在窗体对象中有俩个重要的消息:WM_QUERYENDSESSION,WM_ENDSESSION,这俩个消息在关机或登出时系统自动发生到每个窗体对象上这个东西在AUTOIT里,我们能监听到吗?就是说我的程序能收到即将要关机或登出的消息吗? 我只能说,肯定可以……
;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
学习了,支持 谢谢分享! 回复 3# ceoguang
谢谢您!~~
这个确实能够监听到。不过似乎 用了这个。之后 的代码 就没有办法 运行了。也就是说不能同时监听同时运行其他 的代码是吗?有办法同时 监听 和运行其他 的代码 吗? 回复 3# ceoguang
win7 下好像没用 win7下是有效的,只是你看不到而已,因为会强制关闭 正好用得到,非常感谢! 不错。发现好东西 回复 8# ceoguang
忘记请教了,WIN7是的可以收到消息,但如何不让WIN7强制关机,也就是不让电脑回应呢? 顶一下,知道的朋友说一下~~~ #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系统。 回复 13# pusofalse
2003 测试成功。
08 R2 32位编译无法挂钩;64位编译直接崩溃。 回复 14# republican
谢谢帮忙测试。果真有很多不足,只是现在还不能够修复它。
页:
[1]
2