wingking84 发表于 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(""),$title) = 1 Then
                $n = $n + 1
                If $n > 1 And TimerDiff($begin) < 600 Then Send("!^{SPACE}")
                $begin = TimerInit()                                       
         
    EndIf
WEnd

xms77 发表于 2012-6-28 13:05:01

本帖最后由 xms77 于 2012-6-28 13:33 编辑

回复 1# wingking84
关键是按一次空格,可能系统检测到的结果是按了几下了,所以,一个字,难~~~~~

wingking84 发表于 2012-6-28 13:20:33

HELP 例子中有sleep.
删除sleep,检查不到是否按了空格。

xms77 发表于 2012-6-28 13:34:22

回复 3# wingking84
应该不是检测不到,而是检查到按了多次了

wingking84 发表于 2012-6-28 13:46:24

回复 4# xms77
没有Send("!^{SPACE}")。

kevinch 发表于 2012-6-28 13:49:47

sleep(20)
ispressed
false false true true true false false true true true false false
两次,看明白没,想出来怎么判断没?
false到true算一次就行了

xms77 发表于 2012-6-28 14:14:21

回复 5# wingking84
你估计两次按下空格的间隔时间不会小于多少毫秒?我认为最起码在100ms以上,一秒钟按10次空格应该不怎么可能做到吧?对于人手

wingking84 发表于 2012-6-28 14:14:27

回复 6# kevinch

没看明白,一楼修改了代码。

wingking84 发表于 2012-6-28 14:21:21

回复 7# xms77

sleep(100)成功率很高,偶尔失败。

kyniel 发表于 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)

xms77 发表于 2012-6-28 16:41:40

不知道有没有像Keyup()的函数,那样就有比较好的精度了,我搜索了整个帮助文档和UDF文档,没有找到类似的

xms77 发表于 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

afan 发表于 2012-6-28 22:22:34

回复wingking84
用GUI和注册$WM_Keydown消息完美解决你的问题,请尝试一下代码:
xms77 发表于 2012-6-28 22:12 http://www.autoitx.com/images/common/back.gif


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

xms77 发表于 2012-6-28 22:47:21

回复 13# afan
谢谢Afan大大指正,对windows消息不是很熟,以上这段代码是借鉴了happyTC的。

netegg 发表于 2012-6-29 01:09:00

本帖最后由 netegg 于 2012-6-29 01:12 编辑

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

当然,这种情况可能有些吹毛求疵,但既然lz没说明,蛋蛋个人认为应该考虑
页: [1] 2
查看完整版本: 进退两难 - 判断按下两次空格