我觉得其中一些术语需要澄清一下:
ahk_exe 是与进程关联的可执行文件的名称(即.exe)。通常,仅使用带有此文件名称的 run 命令通常不会执行任何操作,因为 AHK 不知道此 .exe 位于哪个文件夹中。只是碰巧与 Windows 计算器一起使用应用程序 [calc.exe],因为这是 Windows 允许您在任何地方运行的程序。解决办法是告诉ahk.exe在哪个文件夹,这样它就可以运行了。
如果您想测试run命令的特定程序参数是否正常工作,您可以打开命令提示符窗口并尝试该命令,将AHK的run替换为命令行的start [例如:run calc.exe 变为 start calc.exe]。
此外,ahk_pid 不是与程序永久关联的常数。事实上,每次你运行一个程序,即使它是同一个确切的程序,Windows 每次都会为其分配一个新的 PID。另外,因为在程序启动后分配了一个新的,所以我们不能用它来初始启动程序。
重要提示!:下面的这段代码不安全,可能会损坏您的 Teams 安装。请参阅更新 1 了解更多信息和更好的替代方案。
这是一个从 C:\Users\[YOUR USER NAME HERE]\appdata\local\Microsoft\Teams\current\Teams.exe 的默认安装位置启动 Teams 应用 (Teams.exe) 的解决方案
run "%LOCALAPPDATA%\Microsoft\Teams\current\Teams.exe"
希望这对您有所帮助。如有其他问题,请lmk
更新1:
回顾我最初的解决方案时,我发现直接运行 Teams.exe 文件并不是一个好的解决方案,因为它有可能破坏 Microsoft Teams 的安装(这发生在我身上)。因此,为了按照开发人员的预期运行 Teams,我选择运行程序的快捷方式文件(即%AppData%\Microsoft\Windows\Start Menu\Programs\ 文件夹中的“Microsoft Teams.lnk”文件)。检查此.lnk 文件后,我发现它包含额外的逻辑和对MS Teams 的Update.exe 文件的调用,有助于防止这些问题的发生。因此,启动 MS Teams 的新 Run 代码将是
run "%AppData%\Microsoft\Windows\Start Menu\Programs\Microsoft Teams.lnk"
解决了这个问题,我们现在可以将这个新的run 命令重新集成到 OP 的程序中。根据我对原始代码的理解,这些是 OP 试图编码的目标(如果其中任何一个不正确,请 lmk 并且我可以更新):
- 如果 Teams 正在运行且当前处于活动状态的窗口,请将其最小化。
- 如果 Teams 正在运行,但不是活动窗口,则将其设为活动窗口
- 如果 Teams 未运行,请运行它并在打开后创建活动窗口。
因此,我们可以有效地将逻辑归结为如下所示(在伪代码中):
If Teams is running
If Teams is the Active Window
Minimize Teams
Else (i.e. Teams is NOT the Active Window)
Make Teams the Active Window
Else (i.e. Teams is NOT running)
Run Teams
Wait until Teams is done opening
Make Teams the Active Window
让我们从检测 Teams 是否正在运行的代码开始。目前,源代码使用它来尝试检测 Teams 是否处于活动状态:If WinExist("Teams ahk_class ApplicationFrameWindow")。忽略此语法是否正确(我从未见过在 WinExist 的同一 "" 块中同时使用 WinTitle 和 ahk_class 参数),至少在这种情况下,使用 ahk_class 可能不是最佳选择可用的。在 OP 提供的Windows Spy 截图中,我们可以看到Teams.exe 的ahk_exe 比Chrome_WidgetWin_1 的ahk_class 更具体。因此,可以使用If WinExist("ahk_exe Teams.exe") 代替此程序来检测 MS Teams 是否已在运行。
接下来我要谈的是,当 Teams “关闭”时,即单击屏幕右上角的 X 按钮,甚至使用 WinClose 命令关闭时,它实际上是默认行为将其最小化到托盘,从中可以使用WinActivate 命令将其最大化,类似于通过单击- 按钮将其最小化到任务栏的情况。因此,根据个人喜好,您可以让 Teams 最小化到任务栏或最小化到托盘,并且仍然与程序的其余部分在功能上相同。尽管这不是 OP 要求或提及的功能,但我觉得这仍然是在此响应中提及/包含的有用行为。
接下来,原始脚本用于激活非活动但仍在运行的 MS Teams 的原始代码如下:
Else
{
WinGet, winState, MinMax
If (winState = -1)
{
WinRestore
WinActivate
}
}
虽然 OP 实现的额外检查和逻辑在某些情况下可能有用,但我觉得它可以有效地缩短并用一个简单的替换
Else
WinActivate
我所做的最后一次偏离原始脚本的更改只是运行 Teams 的那一点,如果它尚未打开的话。我觉得我已经对上面的变化进行了足够的讨论,但总结一下:run ahk_exe Teams.exe 被替换为run "%AppData%\Microsoft\Windows\Start Menu\Programs\Microsoft Teams.lnk"
最终代码:
F11::
If WinExist("ahk_exe Teams.exe")
{
IfWinActive
WinMinimize ;Use this if you want to minimize Teams to the Taskbar
;WinClose ;Use this if you want to minimize Teams to the Tray
Else
WinActivate
}
Else
{
run "%AppData%\Microsoft\Windows\Start Menu\Programs\Microsoft Teams.lnk"
WinWait, Teams
WinActivate
}
return
这比平时长了一点,但我希望这会有所帮助。再次重申,如果您有任何问题/意见/疑虑,或者只是想了解更多信息,请随时提出。