首页 > 解决方案 > 为什么是`PrevActiveClass?WinActivate ahk_class %PrevActiveClass%` 不起作用?

问题描述

PrevActiveClass分配了一个值,以下代码将不会激活PrevActiveClass(尽管语法适用于 assignment):

PrevActiveClass ? WinActivate ahk_class %PrevActiveClass%

但以下将激活PrevActiveClass

if (PrevActiveClass) {
  WinActivate ahk_class %PrevActiveClass%
}

为什么第一个片段不起作用,以及如何在一行代码中实现相同的逻辑?

标签: if-statementconditional-statementsoperatorsautohotkeyconditional-operator

解决方案


当您使用三元组时,您处于表达式中。

遗留命令只能在遗留语句中使用,所以更清楚地说,只能在新行的开头(在正常情况下)

您现在要做的是将三个变量连接在一起(并丢弃结果) namedWinActivateahk_class一个动态变量 named PrevActiveClass

如何在一行代码中实现相同的逻辑?

你不能。

你能做的最好的是两行:

if (PrevActiveClass)
  WinActivate, % "ahk_class " PrevActiveClass

(我切换到使用表达式,也可以在旧语法中工作,但是 ew,旧语法)

从技术上讲,您当然可以这样做:

WinActivate, % PrevActiveClass ? "ahk_class " PrevActiveClass : "NonExistentWindow"

但这将是一个非常愚蠢的设计。

此外,您可以定义自己的函数来激活窗口,然后在表达式中调用它:

PrevActiveClass ? WinActivateFunc("ahk_class " PrevActiveClass)

WinActivateFunc(WinTitle := "", WinText := "", ExcludeTitle := "", ExcludeText := "")
{
  WinActivate, % WinTitle, % WinText, % ExcludeTitle, % ExcludeText
}

有些人实际上这样做是为了他们可以使用内联的旧命令。

我知道人们还制作了一些库,它们为每个(?)遗留命令提供类似的功能。

您应该可以从 AHK 论坛中找到一个。


另外,我想 AHKv2 值得在这里提及,因为 v2 中根本没有遗留语法。那里不存在这个问题。


推荐阅读