_WinAPI_RegisterHotKey 中$hWnd参数有什么实际意义吗?
想注册一个指定窗口激活时才生效的热键, 看到_WinAPI_RegisterHotKey( $hWnd, $ID, $iModifiers, $vkCode )_WinAPI_RegisterHotKey( $hWnd, $ID, $iModifiers, $vkCode )
$hWnd
接收热键产生的WM_HOTKEY消息的窗体句柄. 该参数为0时, WM_HOTKEY消息传递给调用线程的消息队列且必须在消息循环中执行.
$ID
指定热键标识. 应用程序须指定一个从0x0000到0xBFFF的id值
$iModifiers
指定用于生成WM_HOTKEY消息需要按下的键与$vkCode参数指定的键的结合. $iModifiers参数可为下列值组合:
$MOD_ALT - 同时按下Alt键
$MOD_CONTROL - 同时按下Ctrl键
$MOD_SHIFT - 同时按下Shift键
$MOD_WIN - 同时按下Win键
$MOD_NOREPEAT - 改变热键操作以便键盘自动回复不会产生多个热键通知(需要Windows 7以上)
$vkCode
指定热键的虚拟键代码($VK_...)
结果发现还是全局的热键, 窗口非激活状态时依然生效.
那这个$hWnd还有什么意义呢?
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global Const $WM_HOTKEY = 0x0312
Global $hGui
$hGui = GUICreate("test")
GUISetState()
GUIRegisterMsg($WM_HOTKEY, 'WM_HOTKEY')
;~ 设置ALT-D
_WinAPI_RegisterHotKey($hGui, 0x0144, $MOD_ALT+$MOD_NOREPEAT, 0x44)
While GUIGetMsg()+3
WEnd
Func WM_HOTKEY($hWnd, $Msg, $wParam, $lParam)
ToolTip('You pressed ALT-D')
EndFunc ;==>WM_HOTKEY
Func OnAutoItExit()
_WinAPI_UnregisterHotKey($hGui, 0x0144)
EndFunc ;==>OnAutoItExit
这四个参数是可以自己写的,不一定都要用 本帖最后由 happytc 于 2011-2-14 07:48 编辑
这个函数本来就是定义系统范围的热键。当注册成功后,热键按下时,Windows系统会给你的应
用程序(窗口)发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的窗口,也就是系统会把WM_HOTKEY消息传递给登记了该热键的线程线程的消息队列首位。如果要定义普通的热键,不要用这个函数,可以使用键盘普通钩子,不用低级钩子。
现在回答你的问题:$hWnd还有什么意义呢? ----------- 意义就在于定义了$hWnd,系统会把WM_HOTKEY消息传给它,若多个程序都定义了相同的热键,则系统会在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。
你可自定义一个专用线程钩子来做,而不是全局钩子,在C里的函数原型是:HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId),第四个参数就是指定专用线程的,这样在钩子函数里处理完消息后,若不显性用象CallNextHookEx函数,这个消息不会再传递的,当然也可以在钩子函数直接返回TRUE来丢弃该消息,并阻止该消息的传递。 多谢楼上的~
页:
[1]