AHK2.0脚本,实现ThinkPad中键(trackpoint)双击关闭窗口(或TAB页)

功能简介:

这是一个基于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()  ; 关闭所有提示
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值