功能简介:
这是一个基于AutoHotKey2.0语法开发的脚本,这个脚本,可以实现双击ThinkPad中键关闭窗口(或TAB页),可以实现在资源管理器双击鼠标左键,实现资源管理器目录返回;这两个操作使用评率非常高,但是单纯使用鼠标操作,两个动作都不太方便。需要频繁移动鼠标,定位关闭按钮或者返回按钮,通过AHK实现双击中键发送关闭窗口或表单命令,双击资源管理器空白处实现返回,可以极大程度减少鼠标移动和定位,操作起来行云流水,用了就回不去了。
带trackpoint的ThinkPad,可以配合XMBC,可以直接替代ThinkPad驱动,让一些经典老键盘,比如SK-8835重换新生。也可以配合ThinkPad驱动(需要把中键滚动设置为中间键单击),体验好像更好。
问题难点:
一是在于如何避免页面意外关闭。因为中键同时承担页面滚动功能,如何避免页面滚动期间中键微动导致页面意外关闭,是困扰我很久的问题,后来通过设置滚动事件时间区间(脚本设置为400ms)屏蔽双击滚动,较好解决了意外关闭问题。目前脚本使用体验非常好,页面/标签页关闭,资源管理器返回操作,行云流水,减少了大量光标移动和找点的操作;对THINKPAD用户或者THINKPAD键盘用户,应该算是福音。
二是升级到WIN10之后,每次电脑重启需要手动启动脚本,我这边没有找到更好的办法,只能通过计划任务,每次系统登录的时候,启动脚本。
#Requires AutoHotkey v2.0
#SingleInstance Force
#HotIf WinActive("ahk_class CabinetWClass")
~LButton::
{
MouseGetPos(&x, &y)
color := PixelGetColor(x, y)
if (A_PriorHotKey = "~LButton" && A_TimeSincePriorHotkey < 400 && A_TimeSincePriorHotkey > 120) && (color = "0xFFFFFF")
{
Tooltip("<<<")
send "!{left}"
Sleep(300)
ToolTip() ; 关闭提示信息
}
}
#HotIf
; 初始化全局变量
global lastScrollTime := A_TickCount
; 监听鼠标中键
~MButton::
{
static lastMiddleClickTime := 0
static clickCount := 0
currentTime := A_TickCount
; 增加点击计数
clickCount += 1
; 如果是第一次点击,记录时间并设置定时器
if (clickCount == 1)
{
lastMiddleClickTime := currentTime
SetTimer CheckDoubleClick, -400
}
; 如果是第二次点击,检查双击条件
else if (clickCount == 2)
{
timeSinceLastClick := currentTime - lastMiddleClickTime
timeSinceLastScroll := currentTime - lastScrollTime
; 检查是否在120ms-到400ms内完成双击,且在过去420ms内没有滚轮事件
if (timeSinceLastClick > 120 && timeSinceLastClick < 400 && timeSinceLastScroll > 420)
{
Tooltip(" X ")
MouseGetPos , , &id, &control
win_class := WinGetClass(id)
win_title := WinGetTitle(id)
; 检查是否为 Sublime Text、Excel、Word 或 PowerPoint 窗口
if (win_class = "PX_WINDOW_CLASS" or InStr(win_title, "Sublime Text")
or win_class = "XLMAIN" or InStr(win_title, " - Excel")
or win_class = "OpusApp" or InStr(win_title, " - Word")
or win_class = "PPTFrameClass" or InStr(win_title, " - PowerPoint")
or control = "SysListView32")
{
ToolTip() ; 关闭提示信息
return ; 如果是Sublime Text窗口,则不执行任何操作
}
if WinExist("ahk_class" win_class) and WinExist(win_title)
{
if (win_class = "Chrome_WidgetWin_1" or win_class = "PX_WINDOW_CLASS")
{
WinActivate
Sleep(200)
send "^w"
Sleep(100)
}
else
{
Sleep(200)
winClose
Sleep(100)
}
}
ToolTip() ; 关闭提示信息;
}
; 重置点击计数
clickCount := 0
}
; 检查双击的定时器函数
CheckDoubleClick() {
if (clickCount == 1)
clickCount := 0
}
}
; 监听滚轮事件
~WheelUp::
~WheelDown::
{
global lastScrollTime ; 确保我们在这里使用全局变量
lastScrollTime := A_TickCount
}
~MButton & h::
{
Tooltip(" X ")
MouseGetPos , , &id, &control
win_class := WinGetClass(id)
win_title := WinGetTitle(id)
if WinExist("ahk_class" win_class) and WinExist(win_title)
{
if (win_class = "Chrome_WidgetWin_1" or win_class = "PX_WINDOW_CLASS")
or (win_class = "PX_WINDOW_CLASS" or InStr(win_title, "Sublime Text"))
{
WinActivate
Sleep(200)
send "^w"
Sleep(100)
}
else
{
Sleep(200)
winClose
Sleep(100)
}
}
ToolTip() ; 关闭提示信息;
}
#HotIf MouseIsOver()
~MButton & g::
{
MouseGetPos , , &id
win_class := WinGetClass(id)
win_title := WinGetTitle(id)
if (WinExist("ahk_class" win_class) and WinExist(win_title))
{
if (win_class = "Chrome_WidgetWin_1"){
Tooltip("⋀⋀⋀")
WinActivate
Sleep(300)
send "^t"
Sleep(300)
}
else if (win_class = "PX_WINDOW_CLASS"){
WinActivate
Sleep(300)
send "^n"
Sleep(300)
}
ToolTip() ; 关闭所有提示
}
}
#HotIf
~MButton & b::
{
MouseGetPos , , &id, &control
win_class := WinGetClass(id)
win_title := WinGetTitle(id)
if WinExist("ahk_class" win_class) and WinExist(win_title)
{
Tooltip("≪≪ ≫≫")
WinActivate
Sleep(200)
send "+#{Right}"
Sleep(50)
WinActivate
Sleep(100)
MoveCursorToActiveWindowCenter()
ToolTip() ; 关闭所有提示
}
}
~MButton & u::
{
Tooltip("↱↱↲↲")
send "^+d"
Sleep(500)
ToolTip() ; 关闭所有提示
}
~CapsLock::
{
If GetKeyState("CapsLock", "T")
ToolTip("大写锁定", 1, 1055)
Else
ToolTip() ; 关闭所有提示
}
MouseIsOver() {
MouseGetPos ,, &Win
win_title := WinGetTitle(Win)
return WinExist(win_title " ahk_id " Win)
}
MoveCursorToActiveWindowCenter() {
WinGetPos &X, &Y, &W, &H, "A" ; 获取当前窗口位置和大小,“A”表示当前激活的窗口
centerX := X + W // 2
centerY := Y + H // 2
DllCall("SetCursorPos", "int", centerX, "int", centerY)
}
Tooltip("脚本已加载")
Sleep(800)
ToolTip() ; 关闭所有提示