进退两难 - 判断按下两次空格
本帖最后由 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:33 编辑
回复 1# wingking84
关键是按一次空格,可能系统检测到的结果是按了几下了,所以,一个字,难~~~~~ HELP 例子中有sleep.
删除sleep,检查不到是否按了空格。 回复 3# wingking84
应该不是检测不到,而是检查到按了多次了 回复 4# xms77
没有Send("!^{SPACE}")。 sleep(20)
ispressed
false false true true true false false true true true false false
两次,看明白没,想出来怎么判断没?
false到true算一次就行了 回复 5# wingking84
你估计两次按下空格的间隔时间不会小于多少毫秒?我认为最起码在100ms以上,一秒钟按10次空格应该不怎么可能做到吧?对于人手 回复 6# kevinch
没看明白,一楼修改了代码。 回复 7# xms77
sleep(100)成功率很高,偶尔失败。 本帖最后由 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)
不知道有没有像Keyup()的函数,那样就有比较好的精度了,我搜索了整个帮助文档和UDF文档,没有找到类似的 回复 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 回复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 回复 13# afan
谢谢Afan大大指正,对windows消息不是很熟,以上这段代码是借鉴了happyTC的。 本帖最后由 netegg 于 2012-6-29 01:12 编辑
afan和xms,问一句,想过没有如果小于系统默认或者auto默认的双击间隔时间,或者远远大于双击间隔时间的情况,楼主只是说判断两次击键,并没说间隔,用消息恐怕有失偏颇
当然,这种情况可能有些吹毛求疵,但既然lz没说明,蛋蛋个人认为应该考虑
页:
[1]
2