autoHotkey---获取输入光标的位置,判断是否在文本输入状态

autoHotkey—获取输入光标的位置,判断是否在文本输入状态

基本环境

为什么要做这个事情.
因为键盘在非编辑模式下存在大面积浪费的情况.仅依靠几个修饰键 功能太局限.双键组合的模式是在锻炼人的指功. 且因为功能键大都在非舒适操作区内,如ctrl,win,fn,等键.比较舒服的左shift 键和 caps lack的功能却很鸡肋. 对中国人来说.
识别非输入状态可以把大面积的字母区变成命令键,就像打cs,英雄联盟一样.
个人认为的快捷键设计原则:

  1. 键少功能多. 少量的人机接口方式,实现更多的功能.
  2. 连击最多2次单击,且由双手食指触发. 因为食指灵敏, 且我们习惯了鼠标的双击动作.
  3. 如果为双键结合,那么修饰键最好按整体功能进行分离,例如 shift 用来修饰编辑文本的. alt用来处理窗口操作的.
  4. 尽可能保留已经习惯的触发键,例如s为保存,f为查找. c为复制
  5. 不同软件的同概念性的快捷键应该保持一致. 例如 ctrl f 为一般的搜索功能,那么可以把百度激活搜索框的快捷键设置为ctrl f. 这样就不需要每次都用鼠标去单击搜索框,也不需要安装vim等插件. 因为是搜索引擎.没有必要保留原本的ctrl+F的功能.
  6. 可将同概念性的功能按软件的先后层次进行顺序切换,例如,在百度里面, 如果没有在输入框中,则按一次ctrl+f先激活输入框,再按一次搜索打开的标签或者直接跳转到系统的全局搜索 ,例如everything这类工具,再按一次则切换回浏览器的输入框,完全没有必要设置那么多个快捷键。
  7. 设计的时候先考虑新添加的功能是否与旧功能具有概念相似性。切记一上来就是一个新的快捷键。这是很多人一开始常犯的毛病。
    举个具体的例子,在pycharm中,单独使用了一个ctrl +d 作为重复一行或者选中内容的快捷键. 其实完全没必要这么做. 只要在原始的复制ctrl+c加一个是否选取内容的判断就可以,当没有选择内容的时候,默认就是重复复制一行. 在选中多行,或者一行中局部内容的时候,直接重复填充反而会很乱. 还要额外去记一个快捷键.

实现过程

1. 先给官方的一个简单例子,用于实时获取当前输入光标的位置.

  • 代码
#Persistent
SetTimer, WatchCaret, 100    ;设置一个定时器,每100ms 运行一次中间那个标签的内容.  
return
;这是一个标签,不是一个函数, 
;ToolTip这是一个提示工具,在以后我们做很多东西的时候很有用. 比如选中某个单词,调用谷歌翻译.直接用他显示,很简洁.      
;A_CaretX 和另一个 是ahk 内置的变量,两边加百分号是为了输出这个变量的值,  不加的话  显示的就直接是 这个英文名"A_CaretX".  注意 %A_CaretX% %A_CaretY% 中间没有逗号.
; 后面的两个 表示的是显示的消息的位置.
;另外,  这个坐标有两种模式,一种是相对当前软件窗口的,一种是相对整个电脑屏幕的. 具体自己可以看下手册的内容
WatchCaret:           
  ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20 
return

所有内置的ahk变量在这边查找

  • 效果

请添加图片描述

测试发现,很遗憾,对于网页端的输入不敏感,类似csdn的编辑界面不能够提取到.

  • 为了稳定判断是否在输入状态,可以配合鼠标的光标类型. 我们知道 光标在输入窗口上一般显示为’工’字型. 所以可以作为上面光标没有 捕捉到的一个补充条件.

另外实际上除了网页内部的输入外,传统的文本编辑器基本上都可以实现. 因为ahk对窗口的处理能力会比较好.

2. 再加入鼠标光标的类型

#Persistent
SetTimer, WatchCaret, 100
return
;  A_Cursor 也是内置变量.表示的是鼠标光标的类型, 例如箭头,工字, 具体看下面.
WatchCaret:
  ToolTip, X%A_CaretX% Y%A_CaretY% %A_Cursor%, A_CaretX, A_CaretY - 20
return
  • 效果
    请添加图片描述

心细的同学会发现, 在这个过程中,鼠标类型的变换是自动的,他是方便提示用户当前窗口的功能为可编辑.但是只有我们单击了这个区域的时候才会是真正的输入状态. 所以仅靠上面两个特征还是不能确定是否在编辑状态.

  • 那么我们可以再引入一个鼠标左键单击的判断.

3. 监听鼠标状态,判断单击的时候是否为’工’字型.

这边有两种思路, 一种是在工字型的时候去判断是否有单击.一种是单击的时候去判断是否为工字型.两种都可以
这边选择用第二种方式.

因为单击是触发条件,逻辑上更简单一点. 第一种逻辑上比较复杂,在等待单击的同时还要处理是否鼠标移开了输入区.在第一种思路里面,记得避免在工字型的循环判断里面用无限等待单击键的方式去做检测。 因为循环被堵塞,就没有办法判断鼠标光标类型是否发生变化。

  • 代码
#Persistent
SetTimer, WatchCaret, 20 ;这边加快了监听器的的监视频率. 20ms一次
isEdit = 0  ; 用于指示是否为编辑状态, 1为编辑状态
WatchCaret:
  ToolTip, X%A_CaretX% Y%A_CaretY% %A_Cursor% %isEdit%, A_CaretX, A_CaretY - 20
  ;下面需要判断两种情况, 一种是在工字型的时候是否单击
  ;一种是在非工字型的时候'
  GetKeyState, state, LButton, P  ; 获取当前左键的状态,  LButton为内置变量,P表示press的状态
  if state = D
  {
    if A_Cursor = IBeam 
    {  
      isEdit = 1
    }
    else
    {
      isEdit=0
    }
  }  
return
  • 效果
    请添加图片描述

4.综合结果

有人会说,感觉用鼠标光标和单击判断的效果就不错. 有没有必要特意去判断输入光标的存在.
回答:完全有必要的.因为我们在操作电脑的时候,有时候不是用鼠标切换装口,而是采用键盘的alt+tab键进行窗口的转换,那么你可能从一个非输入窗口转换到word中或者微信中这类编辑为主的软件,而他默认的就是在输入状态. 如果这时候仅从鼠标单击判断的话,就会丢失状态.

  • 代码, 输入光标+鼠标光标+左键单击的代码.
#Persistent
SetTimer, WatchCaret, 20
isEdit = 0 ; 一个可以用来做判断的编辑模式标志符号,方便你在其他热键触发的时候用
WatchCaret:
  if isEdit = 0
  {
  ToolTip,非编辑模式, A_CursorX, A_CursorY - 20  
  }
  if isEdit = 1
  {  
  ToolTip,编辑模式, A_CursorX, A_CursorY - 20    
  }
  ;下面需要判断两种情况, 一种是在工字型的时候是否单击
  ;一种是在非工字型的时候'
  GetKeyState, state, LButton, P  ; 获取当前左键的状态,  LButton为内置变量,P表示press的状态
  if state = D
  {
    if A_Cursor = IBeam ![请添加图片描述](https://img-blog.csdnimg.cn/c926dfb738074bccb1542973e20beb73.gif)

    {  
      isEdit = 1
    }
    else
    {
      isEdit=0
    }
  }  
  ; 只要输入光标存在,无论前面的鼠标操作如何,都会是编辑状态.  光标不存在并不代表不在输入,所以不处理.
    if A_CaretX
  {
    isEdit = 1
  }
return
  • 效果
    请添加图片描述
    请添加图片描述

局限

可以看到现在能应对多数情况. 但是仍然存在很大的局限性.

  1. 在网页浏览的时候,在非链接的文字部分进行单击,也会被误以为在输入,因为光标也会变成工字型.
  2. 从普通窗口中的输入状态用 键盘转换到其他非输入状态的时候不能被识别. 因为在没有鼠标介入的时候我们无法确定没有输入光标存在的时候的准确状态.
  • 解决方法,可以把脚本写成严格的遵循输入光标存在与否. 然后另写一个指定在浏览器窗口运行的宽松型的仅靠鼠标单击来判断的脚本. 这个之后再添加.
  • 如果你有其他代码可以严格判断在浏览器的状态,请一定要告诉我!!. 目前可能的操作就是结合ahk的网页操作部分的代码,但是比较难.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值