macOS
建议将 cpas_lock 换为 fn,以防止与 macOS 一键打开/切换到 App(替代 Cmd + Tab) 中的按键产生冲突。
{ "description": "方向: caps_lock + h/j/k/l", "manipulators": [ { "from": { "key_code": "h", "modifiers": { "mandatory": ["caps_lock"], "optional": ["any"] } }, "to": [{ "key_code": "left_arrow" }], "type": "basic" }, { "from": { "key_code": "j", "modifiers": { "mandatory": ["caps_lock"], "optional": ["any"] } }, "to": [{ "key_code": "down_arrow" }], "type": "basic" }, { "from": { "key_code": "k", "modifiers": { "mandatory": ["caps_lock"], "optional": ["any"] } }, "to": [{ "key_code": "up_arrow" }], "type": "basic" }, { "from": { "key_code": "l", "modifiers": { "mandatory": ["caps_lock"], "optional": ["any"] } }, "to": [{ "key_code": "right_arrow" }], "type": "basic" } ] }
Windows
#SingleInstance Force #InstallKeybdHook Menu, Tray, Tip, CapsLock + HJKL to arrow keys ; P:是否按下,T:是否开启 ; 只有松开后状态才会切换,只要未松开状态就是按下前的状态 #If GetKeyState("CapsLock", "P") h:: Send {Left} initialCapsLockState := GetKeyState("CapsLock", "T") return j:: Send {Down} initialCapsLockState := GetKeyState("CapsLock", "T") return k:: Send {Up} initialCapsLockState := GetKeyState("CapsLock", "T") return l:: Send {Right} initialCapsLockState := GetKeyState("CapsLock", "T") return ; 将当前窗口置顶/取消置顶 t:: initialCapsLockState := GetKeyState("CapsLock", "T") ;WinSet, AlwaysOnTop, Toggle, A ;置顶的同时增加透明度以区分是否被置顶 WinGet, alpha, Transparent, A isTop := IsWindowTopmost() WinSet, AlwaysOnTop, % (isTop ? "Off", "On"), A WinSet, Transparent, % (isTop ? 255, 200), A ; 0透明,255不透明 #If ; 如果写了UP则需要手动处理切换状态,如果方法体为空则不切换 CapsLock Up:: ; 仅按下 CapsLock 未使用组合键时切换 CapsLock 的状态、使用组合键则保持现状不执行切换(什么也不做) if (initialCapsLockState = "") { SetCapsLockState % !GetKeyState("CapsLock", "T") } ; 重置变量 initialCapsLockState := "" return ; 检测当前窗口是否已置顶 IsWindowTopmost() { activeWindow := WinExist("A") exStyle := DllCall("GetWindowLong", "Ptr", activeWindow, "Int", -20) return (exStyle & 0x00000008) != 0 }