【问题标题】:AutoHotkey Remapping Korean Keys to CtrlAutoHotkey 将韩语键重新映射到 Ctrl
【发布时间】:2012-08-09 02:41:37
【问题描述】:

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

我猜问题在于它们似乎生成 KeyUp 事件,并且它们不重复像其他键。我有一个非常糟糕的解决方案,涉及使用自动热键的循环。还对另一个非免费程序 KeyManager 做了类似的事情。我希望有一些更高级的技巧或解决方法(AutoHotkey、驱动程序或其他)。

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

按下(并按住)汉字的键盘钩子输出:

您可以看到没有重复,也没有向上事件。

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}

结果:

汉字+t后,热键触发,但随后按ONLY t 单独执行相同的操作。 LCtrl Up 似乎没有出现。

Abe 基于SetTimer 的重置虽然不错!感觉就像我的原始代码的一个更优雅的版本。但是,问题在于延迟 - 我必须调整输入速度以匹配延迟。

其他经过测试的解决方案:

GetKeyState("vk19", "p") 总是在脚本加载和第一次按下后报告 PRESSED。它永远不会打破这种状态——即使在我释放密钥很久之后。

KeyWait 也无法按预期工作。

sc1F1 up::traytip,, test 在任意次数的按下/释放后也不会产生托盘提示。

【问题讨论】:

  • 始终使用来自ahkscript.org的AutoHotkey(当前版本,新官网)!来自 autohotkey.com 的 AutoHotkey 已过时,使用它运行脚本时可能会遇到一些问题!此外,如果您在获取 AutoHotkey 文档中未列出的特殊键的名称时遇到任何问题,请查看以下答案:stackoverflow.com/questions/24921492/…

标签: windows keyboard autohotkey


【解决方案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

【讨论】:

  • 感谢sn-p;但是,并不是我希望的解决方案。 Input 似乎不支持修饰键。所以如果我想支持 sc###(开始序列被重新映射到 Ctrl)然后 Alt+Something 或 Shift+Something,我猜这个循环会变得更加复杂?
  • 您是对的,输入不会组合各种修饰符,但是(取决于添加的特殊键作为参数)输入将单独处理每个按下的键。我在想,如果您的组合键(将通过输入一一处理)将以例如结尾一个字母字符,您可以将其用作完成触发器....
  • 这是一个有趣的想法;实际上,它只需要跟踪其他修饰键并在按下 =any= 非修饰符时批量发送(例如 C-M-e 或 C-M-\ 或 C-u C-c 等)。它可能就像一个 ctrl 锁定键,并重复批量发送,直到被完成键切换或终止。
【解决方案2】:

让脚本发送{Ctrl down}
然后设置一个计时器以在所需的时间后运行子程序 (示例中为 600 毫秒)
( - 使它只运行一次)
发送{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

每按一次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 变成一个修饰符(第一行保持 capslock 灯不亮):

SetCapsLockState, AlwaysOff

capslock & x::traytip,, %a_thishotkey%

如果您希望 Capslock 在单独按下时发送某些内容
您将需要添加类似:

capslock::Send, something

然后那只会在 Capslockrelease 上出现“一些东西”。

→Additional information←


这是一个示例,如果 Capslock 被物理(“p”)按住,则 XA 执行不同:

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"

【讨论】:

  • @abe 正确,它不能按预期工作。就 AutoHotkey 而言,某种时间/延迟解决方案(或 Robert 建议的终止键)似乎是我所希望的最好的解决方案。
  • @abe 是的,刚刚测试过 - 托盘提示永远不会出现。更新了原帖;另外,对于您的标志情况,我需要支持几乎所有按下的键。 Ctrl+anything 以及 Ctrl+[alt/shift]+anything。我认为这就是罗伯特建议采用这种方法的原因。
  • @assem 我在答案的底部添加了该链接,还意识到我在第一个示例中放置了SetTimer, Reset, 600,它每600ms不断调用Reset。 SetTimer, Reset, -600 只会调用一次。
  • @abe 感谢计时器更新;但是,注册表键映射无法按预期用于此汉字键。
【解决方案3】:

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

SC11D:: RCtrl
SC138:: RAlt

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

在 Win8 上使用韩语 Microsoft IME。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2020-11-13
    • 2021-09-04
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多