使用AutoHotKey 扩展宏定义小键盘的功能

小键盘样式:

这款小键盘的宏定义软件名称为x806

打开后界面如下:(键的映射值F13~F20是我修改后的结果,后面会说明修改过程).

软件中提供了一系列游戏中的快捷键, 可以通过这款软件进行键位映射.

但是我不玩游戏, 这个功能我不需要, 我在保存其配置时,发现,这个软件的键值定义config.ini文件中,文件位置在x806.exe 程序运行目录 下 skin/config/config.ini

用vs code (或者其他文本编辑器)打开此配置文件后, 找到[Config0], 程序界面上游戏模式1 的配置在[Config0], 游戏模式2 在[Config2], 游戏模式3 在[Config3]

配置节选见以下代码.

[Config0]
K0=42,30
K1=42,31
K2=42,32
K3=42,33
K4=42,34
K5=42,35
K6=42,36
K7=42,37
K8=14
K9=1
K10=1

笔者这款键盘只有8个键, 对应配置中K0~k7, 不做任何修改的情况下, 键1~键8的功能就是输入字符对应的数字1~8. 经过我的一番折腾, 总结配置修改规律, 我找到了部分键和键值的对应关系,以表格呈现:

修改成其他键值, 则键盘的功能不能最大化, 大部分人的键盘上是没有F13~F24的, 我将键值修改如下:

[Config0]
K0=42,104
K1=42,105
K2=42,106
K3=42,107
K4=42,108
K5=42,109
K6=42,110
K7=42,111

即键1映射为F13, 键2映射为F14, 以此类推,直至键8映射为F20, 修改后, 打开x806软件, 界面中会显示上文中的修改结果.

这样不会和键盘上已有功能键重复, 下面就是通过AutoHotKey,来扩展功能了,笔者的版本是 2.0.5

废话不多说, 上autohotkey代码

g_ChgMode := false
g_ModeIdx := 0
g_timeSpanMs1 := 500

HideTrayTip() {
    TrayTip  ; 尝试以普通的方式隐藏它.
    if SubStr(A_OSVersion, 1, 3) = "10." {
        A_IconHidden := true
        Sleep 200  ; 可能有必要调整 sleep 的时间.
        A_IconHidden := false
    }
}

showTrayTip(title, msg, timeSpanMs)
{
    HideTrayTip
    TrayTip title, msg
    ; Sleep timeSpanMs
    ; HideTrayTip
}

;|物理按键  |实际键值| 模式一normal     |模式二multimedia|模式三|模式四|模式五| 模式六|模式七|模式八|
;| -----    | ----- | ----          | ----          | ---- | ---- | ---- | ---- | ---- | ---- |
;|k1        |F13    |复制           |网易云音乐     |QtDebug|Url|undefined!|undefined!|undefined!|
;|k2        |F14    |粘贴           |Play_pause     |StepOver|RtkFolder|undefined!|undefined!|undefined! |
;|k3        |F15    |搜索           |MediaNext      |StepInto|UtoVRPlayerFolder|undefined!|undefined!|undefined!|
;|k4        |F16    |空格         |MediaPrev      |StepOut|qssFolder|undefined!|undefined!|undefined!|
;|k5        |F17    |undo           |音量-          |StartDebug|MakeRelease|undefined!|undefined! |undefined!|
;|k6        |F18    |redo           |音量+          |StepOver|undefined!|undefined!|undefined!|undefined!|
;|k7        |F19    |锁屏           |音量-          |StepInto|undefined!|undefined!|undefined!|undefined!|
;|k8        |F20    |执行           |音量+          |StepOut|undefined!|undefined!|undefined!| 


; K1~k8  F13~F20
F13:: ;K1
KeyMoreClicks(ThisHotkey)
{
    global g_ChgMode
    global g_ModeIdx
    static curKey_presses := 0
    if curKey_presses > 0 ; SetTimer 已经启动, 所以我们记录键击.
    {
        curKey_presses += 1
        ; TrayTip curKey_presses, A_TimeSincePriorHotkey
        return
    }
    ; 否则, 这是新开始系列中的首次按下. 把次数设为 1 并启动计时器
    curKey_presses := 1
    SetTimer AfterTimeCnt, -400 ; 在 x 毫秒内等待更多的键击.

    AfterTimeCnt()  ; 这是一个嵌套函数.
    {
        if curKey_presses = 1 ; 此键按下了一次.
        {
            if g_ChgMode
            {
                g_ModeIdx := 0
                g_ChgMode := false

                curKey_presses := 0

                showTrayTip "Mode1: Normal", "k1-Copy K2-Paste k3-Search k4-shift+Del", g_timeSpanMs1
                return
            }

            switch g_ModeIdx {
                case 0: send "^c"                ;复制
                    ; case 0: run 'code -n D:\SVNCode\VTM_QT6_5\AutoMakeRelease\Make.bat'
                    ; case 0: run 'D:\SVNCode\VTM_QT6_5\AutoMakeRelease\Make.bat', "D:\SVNCode\VTM_QT6_5\AutoMakeRelease\"
                    ; case 0: Run 'wordpad.exe "C:\Program Files\AutoHotkey\license.txt"'
                    ; case 0: Run A_ComSpec ' /c ""code.exe" "-n" "D:\SVNCode\VTM_QT6_5\AutoMakeRelease\Make.bat" >"C:\My File.txt""'
                    ; case 0: run A_ComSpec 'code.exe'
                    ; case 0:
                    ;     {
                    ;         cmd := "code D:\SVNCode\VTM_QT6_5\AutoMakeRelease\Make.bat"
                    ;         RunWait A_ComSpec ' /c "' cmd '"',,"Hide"
                    ;     }
                case 1: run "e:\Program Files (x86)\NetEase\CloudMusic\cloudmusic.exe" ;网易云音乐
                case 2: send "{F5}"
                case 3: send "^l"
                case 4: run "D:\sys_userpath\documents\My RTX Files\devin"
                case 5: Run "cmd", "C:\"
                case 6: send "^c"
                case 7: send "^c"
                default: MsgBox "mode error!"
            }
        }
        else if curKey_presses = 2 ; 此键按下了两次.
        {
            showTrayTip "Change Mode: Press index", "mode1-Normal mode2-Multimedia mode3-QtDebug mode4-QtShotcut", g_timeSpanMs1
            g_ChgMode := true
        }
        else if curKey_presses > 2 ;超过两次的连击,则回到模式1
        {
            g_ModeIdx := 0
            g_ChgMode := false

            curKey_presses := 0

            showTrayTip "Mode1: Normal", "k1-Copy K2-Paste k3-Search k4-shift+Del", g_timeSpanMs1
            return
        }

        ; 不论触发了上面的哪个动作, 都对 count 进行重置
        ; 为下一个系列的按键做准备:
        curKey_presses := 0
    }
}

F14:: ;K2
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 1
        g_ChgMode := false

        showTrayTip "Mode2: Multimedia", "K1-Cloudmusic K2-Play_pause K3-MediaNext K4-MediaPrev", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        case 0: send "^v"
        case 1: send "{Media_Play_Pause}"
        case 2: send "{F10}"
        case 3: send "^+v"
        case 4: run "D:\SVNCode\VTM_QT6_5\VTMAPP\Release\player\assets\jsvto\player"
        case 5:
        {
            cmd := "cmd.exe /A /Q /K D:\Qt2\6.4.3\msvc2019_64\bin\qtenv2.bat"
            RunWait A_ComSpec ' /c "' cmd '"'
        }
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

F15:: ;K3
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 2
        g_ChgMode := false

        showTrayTip "Mode3: QtDebug", "K1-StartDebug K2-StepOver K3-StepInto K4-StepOut", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        case 0: send "^f"
        case 1: send "{Media_Prev}"
        case 2: send "{F11}"
        case 3: send "^+u"
        case 4:
        {
            cmd := "code -r D:\SVNCode\VTM_QT6_5\VTMAPP\Release\skin\qss"
            RunWait A_ComSpec ' /c "' cmd '"', , "Hide"
        }
        case 5: send "^c"
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

F16:: ;K4
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 3
        g_ChgMode := false

        showTrayTip "Mode4: QtShortcut", "K1-FollowSymbol K2-SwitchH&Cpp K3-SymbolReferences K4-RenameSymbol", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        ; case 0: send "{Enter}"
        ; case 0: send "!{F4}" ; 关闭窗口
        case 0: send "{Space}" ; 空格
        ; case 0: send "+{Del}"
        case 1: send "{Media_Next}"
        case 2: send "+{F11}"
        ; case 3: send "^+r"
        case 3: send "+{Del}"
        case 4:
        {
            cmd := "code D:\SVNCode\VTM_QT6_5\AutoMakeRelease\Make.bat"
            RunWait A_ComSpec ' /c "' cmd '"', , "Hide"
        }
        case 5: send "^c"
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

F17:: ;K5
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 4
        g_ChgMode := false

        showTrayTip "Mode5: Url", "K1-RtkFolder K2-UtoVRPlayerFolder K3-qssFolder K4-MakeRelease", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        ; case 0: DllCall("user32\LockWorkStation")
        ; case 0: send "^{F5}" ; ctrl + F5 vs编译执行
        case 0: send "^z"
        case 1: send "{Volume_Down}"
        case 2: send "{F9}"
        case 3: send "^/"       
        case 4: run 'D:\SVNCode\VTM_QT6_5\AutoMakeRelease\Make.bat', "D:\SVNCode\VTM_QT6_5\AutoMakeRelease\"
        case 5: send "^c"
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

F18:: ;K6
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 5
        g_ChgMode := false

        showTrayTip "K6undefined!", "undefined!", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        ; case 0: send "^a"
        case 0: send "^y"
        case 1: send "{Volume_Up}"
        case 2: send "^{F9}"
        case 3:
        {
            send "^a"
            send "^i"
            send "{Click}"
            send "^+!w" ;Qt中自定义的快捷键,用于删除空白字符
        }
        case 4: run "\\file1\UPLOAD\devin"
        case 5: send "^c"
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

F19:: ;K7
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 6
        g_ChgMode := false

        showTrayTip "K7undefined!", "undefined!", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        case 0: DllCall("user32\LockWorkStation") ; 锁屏        
        case 1: Run "explorer.exe shell:Appsfolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" ;打开edge浏览器
        case 2: run "D:\VTM_config"
        case 3: send "^<"
        case 4: run "http://192.168.0.130:8096/demo/html/%E5%8A%A0%E8%A7%A3%E5%AF%86__VTM.html"
        case 5: send "^c"
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

F20:: ;K8
{
    global g_ChgMode
    global g_ModeIdx
    if g_ChgMode
    {
        g_ModeIdx := 7
        g_ChgMode := false

        showTrayTip "K8undefined!", "undefined!", g_timeSpanMs1
        return
    }

    switch g_ModeIdx {
        ; case 0: 
        ; {
        ;     ; 关闭edge,启动qt creator
        ;     Send "^w"
        ;     sleep 50
        ;     if WinActive("ahk_exe msedge.exe")
        ;     {
        ;         WinMinimize
        ;         WinActivate "ahk_exe qtcreator.exe"
        ;     }

        ;     ; 打开notepad
        ;     ; Run "notepad.exe"
        ;     ; WinWait "ahk_class Notepad"
        ;     ; Sleep 500
        ;     ; WinHide ; 使用由 WinWait 找到的窗口.
        ;     ; Sleep 1000
        ;     ; WinShow ; 使用由 WinWait 找到的窗口.
        ; }
        case 0: send "^{F5}" ; ctrl + F5 vs编译执行        
        case 1: run "calc"
        case 2: send "^r"
        case 3: send "^>"
        case 4: run "http://www.ichacha.net/fanyi.aspx"
        case 5: send "^c"
        case 6: send "^c"
        case 7: send "^c"
        default: MsgBox "mode error!"
    }
}

代码要点:

1.K1的处理函数中, 有单击,双击, 三击(或更多),的不同处理, 单击即该按键的通常功能, 

双击后, 则进入模式选择状态, 此时可通过按下K1~K8中任意一个键,选择对应的模式,

不同模式下,每个按键执行不同的功能,假设每个模式,每个键都分配了功能, 则通过切换不同模式, 一共可以执行 8*8,共计64种功能, 一键启动自己心仪的常用功能,岂不爽哉?

如果此时再配合上x806中三种模式的切换, 可执行的功能将有 64*3, 想想都有点可怕.

2.每次执行模式切换和模式选择时, 系统托盘中都有提示.通过 showTrayTip函数实现.

补充:

1.开机启动

ahk(AutoHotKey)脚本开机启动的设置方法:

将编写好的.ahk文件放置到开机启动文件夹下即可,

路径一般为 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值