用ahk自带的变量判断鼠标双击和拖动

由于最近想做一个类似有道翻译的划词翻译,就来思考如何判断我当前选中了单词,最开始看王上的大神判断背景,或者钩子函数,后来尝试了一下都达不到理想的效果,后来突发奇想为啥不能判断当前鼠标状态来判断当前的用户操作,然后看帖子都是用定时器实现的,我想了想定时器这个东西不但耗性能还不太好控制,然后翻看文档发现有一些内置的变量可以来实现这个操作,分别是判断前一个快捷键A_PriorHotkey,和判断前一个快捷键离当前快捷键的键击时间间隔A_TimeSincePriorHotkey,利用这个两个变量我们即可实现鼠标双击和拖动的判断了。

还可以判断很多行为来限制,比如鼠标点下时的形态必须是工形IBeam,弹起的时候也是,判断在某些应用中试用,判断拖动距离时间等来降低触发灵敏度,很是灵活。

废话不多说上代码:

#InstallMouseHook
#InstallKeybdHook
#KeyHistory  499
CoordMode,Mouse,Screen ;全局获取模式

cursor_dbclick_gaptime:=100 ;鼠标两次点击事件间隔时间小于这个时间判断为双击
cursor_drag_gaptime :=300 ;鼠标按下到弹起时间大于这个时间判断为拖动
cursor_over_dist:=30 ;鼠标横扫的像素大于等于这个值时认为是拖动
LB_down_cursor:=0 ;按下时鼠标的形状
LB_down_posx:=0
~LButton::

    LB_down_cursor :=A_Cursor
    MouseGetPos,LB_down_posx
    if(A_PriorHotkey="~LButton up" && A_TimeSincePriorHotkey<=cursor_dbclick_gaptime && A_Cursor="IBeam" ) ;判断鼠标双击事件
    {
           tooltip ,dbclick
    }
    return ;
~LButton up::
;    tooltip % A_PriorHotkey "," A_TimeSincePriorHotkey
    MouseGetPos,current_posx
    if(A_PriorHotkey="~LButton" && A_TimeSincePriorHotkey>=cursor_drag_gaptime ) ;判断鼠标拖动事件
    {
        if((LB_down_cursor="IBeam" && A_Cursor="IBeam")&& abs(current_posx-LB_down_posx)> cursor_over_dist) ; 限制鼠标形状的双击
        {
            tooltip, dragging
        }
        return
    }
    return

 

效果展示:

用ahk自带的变量判断鼠标双击和拖动

最后关于性能和是否影响系统点击的问题,使用~是通过钩子函数来实现事件的传递,比如点击事件可能被多个程序hook,我们只不过在上面再加了一个hook,我们的hook会立即返回不会打断整个hook链,理论上来说多一个hook就多一些时间,但是这个影响微乎其微,除非直接返回1直接中断当前事件传递,才会影响系统的点击事件。实测在fps游戏中也没任何影响。

—————

完!

 

给TA捐赠
共{{data.count}}人
人已捐赠
其他应用案例

[股票]爬取i问财主动买入前100股票

2023-1-8 22:54:31

其他

临时定义按键的小工具

2023-1-11 14:09:37

3 条回复 A文章作者 M管理员
  1. AHK中文社区

    图片想在正文中展示,也需要在正文中放一个。 修改按钮在标题下面,有个编辑按钮

  2. 螃蟹瑞桥

    很赞

  3. 螃蟹瑞桥
    螃蟹瑞桥给作者打赏了¥2
个人中心
购物车
优惠劵
有新私信 私信列表
搜索