小键盘样式:

这款小键盘的宏定义软件名称为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

1202

被折叠的 条评论
为什么被折叠?



