找回密码
 加入
搜索
查看: 4603|回复: 3

[AU3基础] _WinAPI_RegisterHotKey 中$hWnd参数有什么实际意义吗?

  [复制链接]
发表于 2011-2-12 17:38:54 | 显示全部楼层 |阅读模式
悬赏50金钱未解决
想注册一个指定窗口激活时才生效的热键, 看到_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

发表于 2011-2-12 18:17:32 | 显示全部楼层
这四个参数是可以自己写的,不一定都要用
发表于 2011-2-14 07:37:08 | 显示全部楼层
本帖最后由 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金钱 +40 贡献 +5 收起 理由
gapkiller + 40 + 5 谢谢

查看全部评分

 楼主| 发表于 2011-2-15 21:29:15 | 显示全部楼层
多谢楼上的~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 16:50 , Processed in 0.082109 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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