2013-06-01 42 views
0

基本上我想要做的是通过使用不同的热键在不同的键盘布局之间切换。在autohotkey中的多组重新映射之间切换

所以,当我按

^+!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:: 

将恢复一切为默认

好像无论我尝试脚本不能编译做重复的热键。这可能与autohotkey实现?

+0

您使用的是AutoHotKey_L吗? – MCL

回答

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定义的每个键和分配给它一个所谓RemapKey子程序,因此它会被调用,当在keyMap的任意键(d˚FĴķ)被按下。 RemapKey通过访问A_ThisHotkey获取最新热键,找出它映射到的内容并发送该密钥。该#UseHook是为了防止Send命令触发另一个热键必需(在我们的情况下,按下**˚F将触发**则JĴ将触发ķ等)。 请注意,如果使用关联对象AutoHotkey_L只有。如果您使用的是其他版本,则必须以另一种方式定义您的地图(例如,像keyMapd:="SPACE"这样的伪数组)。

0

这是一种替代方法,也需要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