找回密码
 加入
搜索
查看: 8965|回复: 25

[AU3基础] 进退两难 - 判断按下两次空格

 火.. [复制链接]
发表于 2012-6-28 10:45:30 | 显示全部楼层 |阅读模式
本帖最后由 wingking84 于 2012-6-28 14:15 编辑

类似双击左键,判断两次空格的按下时间。
求解答。
;简化了下代码:

$n = 0
$begin = 2000
While 1
    ; 关键就在这个sleep,20时,从运行结果看,按一次空格相当按了2次空格,Send("!^{SPACE}")。
   ; 如果改为200,双击空格过快则相当只按了一次空格,过慢则超过限定间隔时间,没有Send("!^{SPACE}")。
    Sleep ( 200 )
        ;按下空格键
    If _IsPressed("20", $dll) And StringInStr(WinGetTitle("[active]"),$title) = 1 Then
                $n = $n + 1
                If $n > 1 And TimerDiff($begin) < 600 Then Send("!^{SPACE}")
                $begin = TimerInit()                                        
          
    EndIf
WEnd
发表于 2012-6-28 13:05:01 | 显示全部楼层
本帖最后由 xms77 于 2012-6-28 13:33 编辑

回复 1# wingking84
关键是按一次空格,可能系统检测到的结果是按了几下了,所以,一个字,难~~~~~
 楼主| 发表于 2012-6-28 13:20:33 | 显示全部楼层
HELP 例子中有sleep.
删除sleep,检查不到是否按了空格。
发表于 2012-6-28 13:34:22 | 显示全部楼层
回复 3# wingking84
应该不是检测不到,而是检查到按了多次了
 楼主| 发表于 2012-6-28 13:46:24 | 显示全部楼层
回复 4# xms77
没有Send("!^{SPACE}")。
发表于 2012-6-28 13:49:47 | 显示全部楼层
sleep(20)
ispressed
false false true true true false false true true true false false
两次,看明白没,想出来怎么判断没?
false到true算一次就行了
发表于 2012-6-28 14:14:21 | 显示全部楼层
回复 5# wingking84
你估计两次按下空格的间隔时间不会小于多少毫秒?我认为最起码在100ms以上,一秒钟按10次空格应该不怎么可能做到吧?对于人手

评分

参与人数 1金钱 +10 收起 理由
wingking84 + 10 有帮助

查看全部评分

 楼主| 发表于 2012-6-28 14:14:27 | 显示全部楼层
回复 6# kevinch

没看明白,一楼修改了代码。
 楼主| 发表于 2012-6-28 14:21:21 | 显示全部楼层
回复 7# xms77

sleep(100)成功率很高,偶尔失败。
发表于 2012-6-28 15:35:30 | 显示全部楼层
本帖最后由 kyniel 于 2012-6-28 15:56 编辑

回复 8# wingking84
6楼说的你没看懂吗?就是两次空格的间隔实际上就是上一次空格释放到下一次空格按下的间隔。
#include <Misc.au3>

Local $hDLL = DllOpen("user32.dll")

While 1
    If _IsPressed("20", $hDLL) Then
                
        ConsoleWrite("First Space Key was pressed." & @CRLF)
                
                While _IsPressed("20", $hDLL)
                Sleep(10)
                WEnd
        
                Global $start=TimerInit()
                ConsoleWrite("First Space Key was released." & @CRLF)
                _SS()        
                ExitLoop
        EndIf
WEnd  
        
Func _SS()        
While 1
If  _IsPressed("20", $hDLL) Then
        
                $time=TimerDiff($start)
                ConsoleWrite("Second Space Key was pressed." & @CRLF)
                ConsoleWrite("The interval between twice Space Key is "&StringFormat("%.2f",$time/1000)&"秒" & @CRLF)
                ExitLoop
EndIf        
WEnd        
EndFunc

DllClose($hDLL)
发表于 2012-6-28 16:41:40 | 显示全部楼层
不知道有没有像Keyup()的函数,那样就有比较好的精度了,我搜索了整个帮助文档和UDF文档,没有找到类似的
发表于 2012-6-28 22:12:33 | 显示全部楼层
回复 9# wingking84
用GUI和注册$WM_Keydown消息完美解决你的问题,请尝试一下代码:
Global Const $WM_KEYDOWN = 0x0101
Local $timer,$interval,$flag

$hwd = GUICreate("TEST",300,300)
GUIRegisterMsg($WM_KEYDOWN, "WM_KeyDown")
;$OkButton = GUICtrlCreateButton("ok",10,10,20,20)
GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_KeyDown($HWnd,$iMsg,$wParam,$lParam)
        Local $KeyNumber = BitAND($wParam,0xFF)
    ;MsgBox(0, "", "按键值是: " & $KeyNumber)
        If $KeyNumber = 32 Then
                If $flag = 0 Then
                        $timer = TimerInit()
                        $flag = 1
                Else
                        $interval = TimerDiff($timer)
                        MsgBox(0,0,"两次空格键的时间间隔是:"& $interval)
                        $flag = 0
                EndIf
        EndIf
EndFunc

评分

参与人数 2金钱 +48 贡献 +6 收起 理由
user3000 + 18 + 2
afan + 30 + 4

查看全部评分

发表于 2012-6-28 22:22:34 | 显示全部楼层
回复  wingking84
用GUI和注册$WM_Keydown消息完美解决你的问题,请尝试一下代码:
xms77 发表于 2012-6-28 22:12



    $WM_KEYDOWN 应该改为 $WM_KEYUP~ WM_KEYDOWN 是 0x0100

评分

参与人数 1金钱 +30 贡献 +3 收起 理由
xms77 + 30 + 3 谢谢指正~

查看全部评分

发表于 2012-6-28 22:47:21 | 显示全部楼层
回复 13# afan
谢谢Afan大大指正,对windows消息不是很熟,以上这段代码是借鉴了happyTC的。
发表于 2012-6-29 01:09:00 | 显示全部楼层
本帖最后由 netegg 于 2012-6-29 01:12 编辑

afan和xms,问一句,想过没有如果小于系统默认或者auto默认的双击间隔时间,或者远远大于双击间隔时间的情况,楼主只是说判断两次击键,并没说间隔,用消息恐怕有失偏颇

当然,这种情况可能有些吹毛求疵,但既然lz没说明,蛋蛋个人认为应该考虑
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 05:41 , Processed in 0.143617 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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