macOS
建议将 cpas_lock 换为 fn,以防止与 macOS 一键打开/切换到 App(替代 Cmd + Tab) 中的按键产生冲突。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | { "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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #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" ) 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 } |