【问题标题】:How to remap key in certain case and not remap in other case with autohotkey?如何在某些情况下重新映射键,而在其他情况下不使用 autohotkey 重新映射?
【发布时间】:2012-07-06 10:50:56
【问题描述】:

我想在 autocad 中打开 caps 时重新映射 alt+e。

当 capslock 没有打开时,alt+e 应该打开菜单编辑。

我使用这样的脚本

<!e::
if(GetKeyState( "CAPSLOCK", "T" ))
{
    SendInput erase{space}wp{space}
}
else
{
    Send !e
}

当我打开 capslock 时,重新映射键就可以了。

当我关闭 capslock 和 alt+e 时,菜单编辑打开,但立即关闭。

谢谢。

【问题讨论】:

  • 我想在autohotkey community 发帖提问。但它总是给我错误:您对问题提供了无效的答案。

标签: autohotkey


【解决方案1】:

您需要在热键的开头添加一个$,以防止else 块中的!e 触发无限循环。您还需要在热键末尾添加Return,以防止脚本继续进入该热键下方的内容。

$!e::
if GetKeyState( "CapsLock", "T" )
    Sendinput, erase{space}wp{space}
else
    Sendinput, !e
Return

(仅当 if/else 块超过一行时才需要括号。)

除此之外,可能的问题是它是一个也设置为发送 alt 的 alt 热键。
我说这是一个问题,因为如果您按住 alt,它会激活菜单,
然后脚本发送 alt,这将与之冲突。
正如 Ricardo 所说,编写此脚本的理想方法是使用 #IF 命令(仅包含在 AHK_L 中)。

#If GetKeyState("CapsLock", "T") and WinActive("AutoCAD")

!e:: SendInput, erase{space}wp{space}

#If

请注意,您可以将WinActive() 函数添加到#If 命令的表达式中。 首先尝试不使用它,并且还要意识到应用程序的标题需要始终完全是“AutoCAD”才能正常工作。我建议找到 AutoCad 的 ahk_class, 使用 AHK 的窗口间谍,而不是使用标题。

如果仍然无法正常工作,则 AHK 的发送速度可能比 AutoCAD 想要接收的速度快。
有关如何处理的信息可以找到here。

【讨论】:

  • 谢谢诚实。现在我使用 shift+e 而不是 alt+e。我试试你的脚本和 autohotkey_L。 caps开启时,alt+e不是打开菜单编辑,而是在autocad中输入字符串“{ctrl}e”。
【解决方案2】:

尝试将 else 块更改为:

Send, {ALTDOWN}e{ALTUP}

我不依赖这些符号在 AutoHotKey 中发送击键。

【讨论】:

  • #If GetKeyState( "CAPSLOCK", "T" ) &lt;!e:: Send, erase{SPACE}wp{SPACE} return
  • 当我启动“#If GetKeyState("CAPSLOCK", "T")
  • 我在上一条评论中无法换行。小代码包含四行,第一是#If GetKeyState ( "CAPSLOCK", "T" ),第二是&lt;!e::,第三 是Send, erase{SPACE}wp{SPACE} 和第四个,最后一个是return。
  • 谢谢。但我收到错误: LineText: #If....此行不包含可识别的操作。我将#If更改为If,此错误消失了。但是另一个错误似乎是行擦除....
  • 谢谢。我更新到 Autohotkey_l。可以加载向上代码。但是按键 ctrl+e 不能大写切换。并且“#IfWinActive AutoCAD”在 autohotkey_l 中不起作用。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2021-09-04
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
相关资源
最近更新 更多