0

基本上我想做的是通过使用不同的热键在不同的键盘布局之间切换。

所以当我按下

^+!F4::

这些键被重新映射

d::Space
f::j
j::k
k::l

并这样做

^+!F8::

将重新映射

a::s
s::d
d::f
f::Space
j::Left
k::Numpad4
l::Numpad5
;::Numpad6

最后

^+!F7::

将所有内容恢复为默认值

似乎我尝试的任何脚本都无法编译以复制热键。这可以通过自动热键实现吗?

4

2 回答 2

0

您可以使用Hotkey命令动态更改热键。这是一个如何重新映射键的小示例:

#Persistent
#UseHook

keyMap := {d: "SPACE", f: "j", j: "k", k: "l"}
; Associative objects are AHK_L only!
; for a pseudo array, do something like this:
; keyMapd := "SPACE"
; keymapf := "j"
; ...

Exit

F4::
    for orig, new in keyMap
    {
        Hotkey, %orig%, RemapKey
    }
return

RemapKey:
    newKey := keyMap[A_ThisHotkey]
    ; to retrieve from a pseudo array, do this:
    ; newKey := keyMap%A_ThisHotkey%
    Send, {%newKey%}
return

keyMap是一个关联数组,将原始键映射到其新目标。按下F4将获取定义的每个键keyMap并为其分配一个名为 的子例程,因此当按下(dfjk)中的RemapKey任何键时,它将被调用。通过访问获取最新的热键,找出它映射到的内容并发送该键。这对于防止命令触发另一个热键是必不可少的(在我们的例子中,按**F 会触发 **J,然后J会触发K等等)。注意,如果AutoHotkey_L 仅使用关联对象keyMapRemapKeyA_ThisHotkey#UseHookSend. 如果您使用其他版本,则必须以另一种方式定义您的地图(例如,伪数组,如keyMapd:="SPACE")。

于 2013-06-01T22:40:18.990 回答
0

This is an alternative way, also requiring AutoHotKey_L.

#SingleInstance Force
Flag:=0
Return

^+!F7::
Flag:=0
TrayTip, AutoHotKey, Keyboard setting Default, 1
Return

^+!F4::
Flag:=1
TrayTip, AutoHotKey, Keyboard setting A, 1
Return

^+!F8::
Flag:=2
TrayTip, AutoHotKey, Keyboard setting B, 1
Return

#If (Flag=1)
x::SoundBeep, 500, 100
d::Space
f::j
j::k
k::l
#If

#If (Flag=2)
x::SoundBeep, 2000, 100
a::s
s::d
d::f
f::Space
j::Left
k::Numpad4
l::Numpad5
;::Numpad6
#If
于 2013-06-02T02:53:13.697 回答