由于最近想做一个类似有道翻译的划词翻译,就来思考如何判断我当前选中了单词,最开始看王上的大神判断背景,或者钩子函数,后来尝试了一下都达不到理想的效果,后来突发奇想为啥不能判断当前鼠标状态来判断当前的用户操作,然后看帖子都是用定时器实现的,我想了想定时器这个东西不但耗性能还不太好控制,然后翻看文档发现有一些内置的变量可以来实现这个操作,分别是判断前一个快捷键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
效果展示:
最后关于性能和是否影响系统点击的问题,使用~是通过钩子函数来实现事件的传递,比如点击事件可能被多个程序hook,我们只不过在上面再加了一个hook,我们的hook会立即返回不会打断整个hook链,理论上来说多一个hook就多一些时间,但是这个影响微乎其微,除非直接返回1直接中断当前事件传递,才会影响系统的点击事件。实测在fps游戏中也没任何影响。
—————
完!
图片想在正文中展示,也需要在正文中放一个。 修改按钮在标题下面,有个编辑按钮
很赞