诡异的鼠标双击失效[已解决]
本帖最后由 happytc 于 2011-1-13 08:25 编辑发现用了 ControlGetFocus(), controlsend()等函数时,在窗口别的地方鼠标双击会有时不灵。
为了测试,设计了如下代码,双击记事本标题栏(最大化/还原窗口大小),就会有时不灵。
随着$Time值越小,不灵的情况发生的几率就变大,若$Time = 100基本上双击完全失效了
这是为什么? 如何解决这种问题?想不通怎么会单单影响双击(左键/右键等都没有问题)
难道要我在DoubleHit函数先判断是否为双击事件,好象au3也没有关于判断双击事件的函数Opt("WinTitleMatchMode", 2)
Run("Notepad")
$Time = 300
AdlibRegister("DoubleHit", $Time)
While 1
Sleep(100000000000)
WEnd
Func DoubleHit()
$CtrlFocus = ControlGetFocus("记事本")
EndFunc 看来不光是我遇到这样的问题,搜了下,还有别的人也遇到同样的问题,但一直没有解决
http://www.autoitx.com/forum.php?mod=viewthread&tid=1989&highlight=%CB%AB%BB%F7 你先看看系统定义的双击是多长时间的 回复 3# netegg
“你先看看系统定义的双击是多长时间的” ----> 这不是关键呀,关键是为什么用这些函数会影响到鼠标双击?
在我的程序中,是要不停地监测在窗口某控件上发生的事件,若在这个控件上发生的事满足条件,则doing something。这下就变成两难了,若把上面的$Time变大,在窗口别的地双击不影响了,但监视的控件动作又经常不灵了。$time变小了,监视的控件动作灵了,但在窗口别的地方双击又会出现不灵的问题。没找到问题的根本原因,就是找到系统定义的双击最大间隔时间也没有用呀,怎么能解决这个问题呢 回复 4# happytc
我没看懂你这段代码的意思 回复 5# netegg
上面给的仅仅是为了说明双击失灵的情况而特别想的一个例子。
在我实际的应用程序中,就如我在4楼所说的,就是adlib一个函数来监控当焦点在窗口某控件上,并按下一个特别键时(如Ctrl键),就doing someting(如执行msgbox()等等)
现在是监视控件没有问题,但出现在窗口别的地方双击失灵问题 回复 6# happytc
你还是给段完整代码我试试吧,实在有点搞不清楚你指的是什么地方的问题 本帖最后由 happytc 于 2011-1-7 06:16 编辑
其实上面给的已经是完整代码了呀,又如下面的吧:实现监控点写字板的字号时,自动设为“18”号字大小
这时你双击写字板的标题栏,不能实现写字板窗口最大化/还原了,也就鼠标双击失灵了。我的目的就是怎么样才能既可以自动设置字号为18,但双击写字板标题栏又不失灵!$Time = 10
AdlibRegister("DoubleHit", $Time)
RunWait("c:\Program Files\Windows NT\Accessories\wordpad") ;<==居然直接写"wordpad"不启动,但在“开始”-“运行”里直接输“wordpad”回车后可以启动
While 1
Sleep(100)
WEnd
Func DoubleHit()
$ctrlFocus = ControlGetFocus("")
If $ctrlFocus = "Edit2" Then
ControlSend("", "", "Edit2", "18" & @CR)
EndIf
EndFunc
经过测试,就是把上面例子中的$Time给得很大,如$Time=1800,也会偶尔双击失灵。
也就是当双击时间间隔内刚好在执行ControlGetFocus()函数,就会导致双击失灵。
在我的程序中,也就是想实现监视若键盘焦点在窗口的控件"Edit1"上时就执行自定义的动作,也就是这句: if ControlGetFocus($hwd) = "Edit1" then do……
但就是执行了这句,就会导致在$hwd这个窗口中双击标签栏(开启新标签/关掉标签)偶尔失灵 这个问题,没有知道呀?
百思不得其解呀!怎么ControlGetFocus函数跟鼠标双击有关了 没什么好困惑的,是因为写字板主窗口收到大量的消息,忙不过来而已,并不是有什么冲突. 回复 11# ceoguang
那怎么别的鼠标动作不受影响呀,如左键/右键等
如果真是这样的话,大侠有没有什么好方法解决上面我的问题:就是既要监控窗口某控件,又不影响鼠标双击。就如8楼我举的例子,如何两全其美呀 control*系列估计是用了sendmessagetimeout,keybd_event等API.看上去很美,其实副作用是很大的.
你8#的代码执行的时候,你拦截一下写字板的消息就知道我所说的是怎么回事了.
所以最好的办法就是自己用API来操作,只取自己所需的. 回复 13# ceoguang
谢了,试了下,果然如此。看来只能用winAPI的来做了,只是图个方便/简单,Control系列用起来的确简单,winAPI的用起来麻烦多了
页:
[1]