发表回复 
讨论 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
2015-12-02, 04 : 08 (这个帖子最后修改于: 2015-12-03 08 : 57 by gxsword.)
看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?

比如这个帮助的例子

代码: (全选)
; 示例 #3: 检测热键的单次, 两次和三次按下. 这样
; 允许热键根据您按下次数的多少
; 执行不同的操作:
#f::
if winc_presses > 0 ; SetTimer 已经启动, 所以我们记录键击.
{
    winc_presses += 1
    return
}
; 否则, 这是新开始系列中的首次按下. 把次数设为 1 并启动
; 计时器:
winc_presses = 1
SetTimer, KeyWinC, 400 ; 在 400 毫秒内等待更多的键击.
return

KeyWinC:
SetTimer, KeyWinC, off
if winc_presses = 1 ; 此键按下了一次.
{
    Run, m:\  ; 打开东京热.
}
else if winc_presses = 2 ; 此键按下了两次.
{
    Run, m:\multimedia  ; 打开一本道.
}
else if winc_presses > 2
{
    MsgBox, 再三思考决定还是看欧美.
}
; 不论观摩了哪个大片, 都删除影片 消灭证据
; 为下一个系列的下载做准备:
winc_presses = 0
return
很明显是等400秒或三次按下都发生之后再执行动作 有一定局限
还有这个是以前看来的 改了一下 看起来挺不错 不过效果也差不多

代码: (全选)
Hotkey,~p, oN, B0 T3

Maker_hits(timeout = 0.2) {
    key := RegExReplace(A_ThisHotKey,"[\*\~\$\#\+\!\^( UP)]")
    Loop
    {
        KeyWait %key%
        KeyWait %key%,DT%timeout%
        If (ErrorLevel)
        Return A_Index
    }
}

~p::
    RecodxPress := Maker_hits()
    If(RecodxPress = 1)
        MsgBox  第一撸
    Else If(RecodxPress = 2)
        MsgBox  撸两次
    Else If(RecodxPress = 3)
        MsgBox  再三撸
Return
感觉效果更精确 其实还是要等
有没有哪位达人 能实现 实时响应 第一次按下立马执行命令1 第二次按下执行命令2
第三次按下 执行命令 3 同时不管执行到了哪一步 超时便退出?
想了几天 各种都不是很理想
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢gxsword
2015-12-02, 13 : 00
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
你的意思是,按了一次后,出现一个命令,然后按第二次,出现第二个?这样可以做到无延迟,但是只能出现特定的操作。
如果是根据按键次数来决定执行哪个动作,那就必须有时间间隔。不然电脑不知道是该做出单击的动作还是双击时执行的动作。否则都会无延迟的发送第一个动作。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-02, 14 : 59
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
应该是可以的,我自己弄了两个有些笨拙的办法,想往递归法靠吧,就是感觉反应比较迟钝,晚点贴代码.
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-02, 20 : 29
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
(2015-12-02 14 : 59)gxsword 提到:  应该是可以的,我自己弄了两个有些笨拙的办法,想往递归法靠吧,就是感觉反应比较迟钝,晚点贴代码.

贴个看看。其实个人觉得,第二个已经比较完美。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-03, 02 : 18 (这个帖子最后修改于: 2015-12-06 21 : 53 by robertL.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
方法1 时间限定循环法,缺陷是运行太繁琐,
代码: (全选)
ElapsedTime := 500
F::
  StartTime := A_TickCount
  Clicked := 1
  loop {
  while(GetKeyState("f") and  Clicked := 1)
  {
    msgbox 要执行的命令A
    Clicked++
    keywait,f
  }
  while   (GetKeyState("f") and Clicked := 2)
  {
    msgbox 要执行的命令B
    Clicked++
    keywait,f
  }
  while   (GetKeyState("f") and Clicked := 3)
  {
    msgbox 要执行的命令C
    Clicked++
    keywait,f
  }
  if Clicked > 3
  break
  } until  ElapsedTime := A_TickCount - StartTime
  Clicked := 0
  Sleep 500
return
可以判定执行3次相同的指令后退出或者500毫秒也退出,如果想执行不同的命令,在lool里多加个循环也可以,但感觉更不可靠了。

第二个方法虽然判定比较精确但缺点是比如连按3下的时候,第一次和第二次是没有反应的,不能执行别的命令
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-03, 04 : 05 (这个帖子最后修改于: 2015-12-03 08 : 51 by robertL.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
这个流程倒是符合我的期望…
代码: (全选)
f::
while  (getkeystate("f"))
{
msgbox  命令1
keywait,f          ;防止重复
}
loop
{
IfGreater A_TimeIdlePhysical 200 break
} until (getkeystate("f","D"))
while (getkeystate("f"))
{
msgbox  命令2
keywait,f
}
loop
{
if (getkeystate("f","D"))
         break
} until  A_TimeIdlePhysical 200
Sleep 1000
return

睡觉时候用手机写错了 原来是这样写的 虽然可以用 但是感觉迟钝
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-03, 06 : 56 (这个帖子最后修改于: 2015-12-03 07 : 43 by zhanglei1371.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
(2015-12-03 02 : 18)gxsword 提到:  方法1 时间限定循环法,缺陷是运行太繁琐,

第二个方法虽然判定比较精确但缺点是比如连按3下的时候,第一次和第二次是没有反应的,不能执行别的命令
你连按三下不就是打算执行第三个命令么?假如你要的是第一个或第二个命令,你按一次或两次不就可以了?假如你按了三次,却出现了二次的命令,这不就成了干扰?
其实看看你最后写的这些,思路本身就有问题。估计是没有测试过就凭空想像着写的吧。语法有些地方就是错的。若是这个思路,倒是另一回事了http://ahk8.com/qa/2091/
个人感觉,如果为某个键设置了多个方案,肯定为了实现这样:单击一次,程序要等待下,这个间隔是必须的,否则立刻就响应的话,就没空再接受第二次键击了,若是一键四用,那​么第三次重复键击后还必须有等待第四次键击的时间,否则立刻响应,你还哪里有时间去输入第四个键?这是最基本的逻辑,脱离了这个逻辑肯定不行的。至于你用的keywait​,默认都是有250毫秒的时间间隔的,这也是你感觉延迟的问题所在。总之,延迟是一键多用的前提,没有了延迟的前提,就谈不上一键多用。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-03, 08 : 38
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
最后那个确实记错了 排列都是错的 手机不好写
可能我没表述清楚 第一次是一个指令A 第二次按下是指令B 第三次按下是指令C 而且是每次点击都能马上响应
第四次不用考虑 延时回到最初设置就行
明白了么?
你发的链接我看了 那个方法我知道得 很容易的 onoff就行
我keywait没设超时啊 用的多其实我感觉keywait这个指令本身判断就有点慢
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-03, 12 : 23 (这个帖子最后修改于: 2015-12-03 13 : 11 by robertL.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
看看这个:按F9多次,输出不同的值
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢zhanglei1371
2015-12-03, 15 : 00
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
看起来很牛逼得样子 等我先研究研究 先弄懂 先谢
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2015-12-04, 23 : 16 (这个帖子最后修改于: 2016-02-24 06 : 52 by feiyue.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
这不是很简单的事情吗?

代码: (全选)
f::
;-- 这里自动判断要松开的按键,如果不准确可以自己定
waitkey:=RegExReplace(A_ThisHotKey,"[*~$\^+!#<>]")

TimeOut:=1000
if key_presses=
  SetTimer, key_presses_Clear, -%TimeOut%
;------------------------
key_presses++

if key_presses=1
  Tooltip, 要执行的命令A

else if key_presses=2
  Tooltip, 要执行的命令B

else if key_presses=3
  Tooltip, 要执行的命令C
;------------------------
SetTimer, key_presses_MoreClear, -%TimeOut%
KeyWait, %waitkey%
Return

key_presses_Clear:
SetTimer, key_presses_MoreClear, Off
key_presses_MoreClear:
key_presses=
Tooltip
Return
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 3用户表示感谢feiyue
2015-12-05, 15 : 27 (这个帖子最后修改于: 2015-12-05 15 : 38 by gxsword.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
果然编程的思路和经验就是实力,谢谢,虽然另外找到了方法,不过你这个看起来更清晰
话说回来你这个代码好像按键精灵样子
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-09-25, 12 : 02 (这个帖子最后修改于: 2017-09-26 17 : 28 by abc001.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
第二个代码试了下,
按P提示第一撸
快速按P2次提示了两个第一撸
快速按P3次提示了一个撸两次、两个第一撸
快速按P4次及以上提示了一个再三撸、两个第一撸
再试发现连按3次以上时随着按速有所差异结果也不同,共同点是每次都有第一撸。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-09-26, 16 : 56 (这个帖子最后修改于: 2017-09-26 17 : 28 by abc001.)
RE: 看了这么多三击4挤的例子讨论,发现一个问题,好像都不能实时执行?有大能能做到?
(2015-12-04 23 : 16)feiyue 提到:  这不是很简单的事情吗?

你这个用来显示提示是没啥问题,可是在执行的过程中,按三次键,三个提示都会依次出现一次,也就是按一次提示A,按第二次时提示B,按第三次时提示C。在真正的应用中,不​可能这样我本要执行3的,你把1和2都执行一遍,这就不太合适了。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合