如何在逻辑语句中释放 AutoHotkey 控件?

How to Release AutoHotkey Control in a Logic Statement?

目标: 在 Outlook 中使用热键 'C' 模仿 'New Email Window',类似于 Gmail。

尝试:

c::
SetTitleMatchMode, 2
    If Not WinActive("Message")
        Send, ^n
return

问题: 这个脚本确实有效,但是 'New Email' Window 里面的 'c' 字符被锁定了,我不能在打字时使用它。

尝试过的解决方案: 我尝试添加并清空 'else {}' 但这似乎不起作用。想法?

环境: Windows 10 / 展望 2016+

这可能就是你想要的,

SetTitleMatchMode,2
#if WinActive("Microsoft Outlook")
{
c::
   Send, ^n

   return
}

这样,就可以在任何地方输入字符 'c',包括新电子邮件 window。但是,如果您在主 Outlook window 中为您打开一封新电子邮件 window,它将触发。

这使用context-sensitive标题匹配C映射到CTRL+N"Microsoft Outlook" 在 window 标题中时:

SetTitleMatchMode 2     ; All #If statements match anywhere in title
#IfWinActive Microsoft Outlook
  c::^n
#IfWinActiv

这成功了。我认为在我的例子中它需要明确知道如果 window 不活跃该怎么做,而在我的例子中它是触发一个常规的 'c',我本以为逻辑是由默认识别。

c::
SetTitleMatchMode 2
    IfWinActive, Outlook
        Send, ^n
    Else
        send, c
return 
$c::
  If (WinActive("Microsoft Outlook") { ;may/may not be "Microsoft Outlook' use window spy to find out more
    send ^N ; if you got that to work then dont mess with this part
  } else {
    send {c}
  }
Return

基本上这会检查 Outlook 是否处于活动状态,如果是,则发送 ^N,如果不是,它将发送字符 C.

但这不是最好的主意:创建用于打字的单键热键...
更好的主意:将热键("::` 之前的部分)更改为类似 $^!c 的内容 ( $ 是为了让任何其他发送 c 的热键都不会激活这个)

另一种方法是:

$~c::
  If (WinActive(ahk_class "outlook.exe") { ; or something along the lines of that...
    sleep 250
    send ^N
  }
Return

除了更好地保留 c 键的功能外,这在大多数情况下都做同样的事情,但是它可能会导致在 outlook 中输入问题,所以再次,

请考虑使用非键入的单键热键,例如 Rcontrol。热键中的 ~ 表示不撤销原始键功能,添加睡眠以确保当您使用热键时保留的 c 字符不会添加到您的新电子邮件中。

希望这对您有所帮助(我很确定这行得通)我不使用 outlook,所以我不知道 Outlook 对这类事情的反应如何,也没有测试过,但我知道了解我的 AHK 基础知识并做了函数语法双重检查,祝你好运,请阅读我在代码中的注释,因为它们对这些代码片段功能至关重要。

如果这两个片段不能满足您的需要,您可能需要添加 && If (Not WinActive("Message")) ;or whatwver the message window is called 添加此内容,因为您的新消息 window 也可能称为 outlook,因此这将干扰打字。