AutoHotkey将韩语键重新映射到Ctrl

时间:2012-08-12 18:24:16

标签: windows keyboard autohotkey

标准韩国键盘上的空格键旁边有两个键(每侧一个),我想将其重新映射为Control或Alt修饰符 - 所以我可以使用比我的小指更强的手指交替(我是一个emacs用户)。

我猜测问题是他们似乎生成KeyUp 事件,他们不重复像其他键。我有一个hacky解决方案,涉及使用autohotkey的循环很糟糕。还用另一个非自由程序KeyManager做了类似的事情。我希望有一些更高级的技巧或解决方法(AutoHotkey,驱动程序或其他)。

;Scan Code for Hanja Key
sc1F1::
Loop 10000
{
SetKeyDelay,-1
Send {Blind}{LCtrl DownTemp}
}
SetKeyDelay,-1
Send {Blind}{LCtrl Up}
Return

键盘挂钩输出按住(并按住) Hanja

你可以看到没有重复和没有上升事件。

VK  SC  Type    Up/Dn   Elapsed Key     Window
74  03F     u   0.08    F5              
19  1F1     d   0.66    Hanja           
74  03F     d   9.58    F5       

更新

尝试:

sc1F1 & t::Send {Blind}{LCtrl DownTemp}{t}{LCtrl Up}

结果:

按下 Hanja + t 后,热键会激活,但随后会按 ONLY t 单独执行相同的操作。 LCtrl Up似乎没有发生。

Abe基于SetTimer的重置很不错!感觉就像我的原始代码更优雅的版本。然而,陷阱是延迟 - 我必须调整我的输入速度以匹配延迟。

其他测试解决方案:

GetKeyState("vk19", "p")在脚本加载和初始按下后始终报告PRESSED。它永远不会破坏这种状态 - 甚至在我释放钥匙后很久。

KeyWait也无法正常使用。

在任意数量的按下/释放后,

sc1F1 up::traytip,, test也不会产生托盘提示。

3 个答案:

答案 0 :(得分:1)

设备与供应,

我还没有完成这个想法,但这会是另一种方法吗? 它将显示按下哪些键(在这种情况下按下一个输入),但您可以创建自己的“完成”条件,然后“组合”按键以创建Alt或Ctrl组合。

sc038:: ; Start when (in this case) the left Alt is pressed, {LAlt} is NOT listed in the input list....
input:=""
   Loop
   {
        Input, in, L1, {Enter}{LControl}{RControl}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}
        EL=%ErrorLevel%
        ToolTip, %EL% and %in% and %A_ThisHotkey%
        if EL = EndKey:Enter
        {
            ToolTip
            Sleep, 5000
            Break
        }
   }
Return

答案 1 :(得分:1)

让脚本发送{Ctrl down}
然后设置一个计时器,在一段所需的时间后运行一个子程序 (示例中为600ms)
( - 使它只运行一次)
发送{Ctrl up}

sc1F1::
Sendinput, {Ctrl Down}
SetTimer, Reset, -600
Return

Reset:
Sendinput, {Ctrl Up}
Return

→SetTimer←


如果你想让它成为一个切换按钮,
即按一下,x发送 Control + A
然后再次按下它以使x恢复正常行为:

sc1F1::Flag:=!Flag

#If Flag
x::Sendinput, ^a
a::Sendinput, test
#If

每次按下Flag时,变量sc1F1的值都会相反 即Flag设置为1或0 #If Flag#If Flag = 1的简写 此示例需要Autohotkey_L(更新/推荐版本),因为它使用#If命令。

使用AHK basic看起来像:

sc1F1::Flag:=!Flag

$x::
if Flag
    Send, ^a
Else
    Send, x
Return

使用
的其他选项/示例 Capslock 代替sc1F1

如果您只想将按钮用作修饰符,则可以尝试使用& 此示例将 Capslock 转换为修饰符(第一行保持封锁灯关闭):

SetCapsLockState, AlwaysOff

capslock & x::traytip,, %a_thishotkey%

如果您希望 Capslock 在单独按下时发送内容 你需要添加类似的东西:

capslock::Send, something

然后只会在 Capslock 发布上找到'某事'。

→Additional information←


这是一个例子,其中 X A 执行不同,如果 Capslock 在物理上(“p”)被按住:

SetCapsLockState, AlwaysOff
#If GetKeystate("capslock","p")
x::traytip,, %a_thishotkey%
a::traytip,, %a_thishotkey%
#If

您也可以尝试设置变量(“标志”),
然后用计时器清除它。

capslock::
Flag := 1
SetTimer, Reset, 600
Return

Reset:
Flag := 0
Return

#If Flag
x::Sendinput, ^a
a::Sendinput, test
#If

手动参考:
#If
GetKeyState()


另一种选择是安装键盘挂钩 然后你可以检查最后按下的键是什么 内置变量:a_priorkey

#InstallKeybdhook

x::
if (a_priorkey = "Capslock") {
    Traytip,, %a_thishotkey%
} Return

→More on built-in variables←


如果一切都失败了,你可以尝试:
Remapping via the Registry's "Scancode Map"

答案 2 :(得分:0)

也许我没有正确理解这个问题,但是我找到了这些密钥的关键特殊代码,这对我来说很有用:

SC11D:: RCtrl
SC138:: RAlt

不确定谁会使用Alt重映射,但为了完整...

在Win8上使用韩语Microsoft IME。