找回密码
 加入
搜索
查看: 2029|回复: 5

[AU3基础] [已解决]为何热键重复注册也会成功

  [复制链接]
发表于 2012-4-5 10:37:00 | 显示全部楼层 |阅读模式
本帖最后由 kxing 于 2012-4-5 13:16 编辑

msgbox(0,'',hotkeyset("^+{a}","_1"))
msgbox(0,'',hotkeyset("^+{a}","_2"))
func _1()

endfunc
func _2()

endfunc
  
为何两次注册同样的热键也是成功的,这是bug还是本身就这样规定。。。。
多谢回答!!!

评分

参与人数 1金钱 +15 收起 理由
afan + 15 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2012-4-5 11:02:13 | 显示全部楼层
其实这个问题:如果你细看hotkeyset 函数参考 语法:HotKeySet ( "热键" [, "函数名"] )
这里特别是细细了解下:参数中函数名后面的话:[可选参数] 按下热键后要调用的函数名.留空则撤销此前设置的热键.
 楼主| 发表于 2012-4-5 11:58:11 | 显示全部楼层
没董楼上的意思,我是说为什么注册同样的热键也能成功。
按道理来说f1这热键被注册了,在没有注销的情况下二次注册就应该失败。
发表于 2012-4-5 12:30:59 | 显示全部楼层
本帖最后由 happytc 于 2012-4-5 12:40 编辑
没董楼上的意思,我是说为什么注册同样的热键也能成功。
按道理来说f1这热键被注册了,在没有注销的情况下 ...
kxing 发表于 2012-4-5 11:58


很多时候,要深入理解呀,要多看MSDN的东西才行!
Au3的HotKeySet函数,其实是调用API里的两个函数:RegisterHotKey和UnRegisterHotKey
函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);
当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。

也就是RegisterHotKey去系统注册热键时,只发现了一个hWnd参数标识的窗口和id标识符(因为au3只有一个主线程,RegisterHotKey只发现唯一创建该热键线程(也就是au3主线程),于是将热键同au3主线程创建的窗口关联起。也就是你发现的以下两句:
msgbox(0,'',hotkeyset("^+{a}","_1"))
msgbox(0,'',hotkeyset("^+{a}","_2"))
返回值都是“1”的原因了。

也就是当有当一个热键有已有相同的hWnd参数标识的窗口和id标识符时,它会把热键绑定在新的函数上,也就上面你给的"_2()"函数上,但RegisterHotKey会注册成功。

评分

参与人数 2金钱 +45 收起 理由
502762378 + 25 很受用
afan + 20

查看全部评分

发表于 2012-4-5 12:39:03 | 显示全部楼层
很多时候,要深入理解呀,要多看MSDN的东西才行!
不过要会跟踪au3调用了那些api函数来实现的,不然都不知道au3内部怎么实现的,也就难以知道所以然了
au3在降低了难度的同时,得知真象的程度也下降了。
所以说某方面得到了好处,必然会在某方面丢掉不少好处!
还有au3帮助里不可能象微软的MSDN那样写得仔细入微的很多Remark以及它的C/C++例子都是千锤百炼的,很能反映出典型问题和用户所关心的东西。
au3它的目的就是降低学习难度,难度低了多少,真相也就会被蒙蔽了多少。
 楼主| 发表于 2012-4-5 13:16:30 | 显示全部楼层
感谢楼上,受教了。。。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 10:20 , Processed in 0.084604 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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