如何解决Autohotkey 未加载 MS Teams
我正在尝试运行 AHK 脚本以根据应用程序的状态打开/显示/最小化团队。我目前对 Windows 计算器有相同的功能工作,但是当我复制/粘贴相同的解决方案时,AHK 无法运行团队。目前,这就是我正在使用的
F11::
If WinExist("Teams ahk_class ApplicationFrameWindow")
{
IfWinActive
WinMinimize
Else
{
WinGet,winState,MinMax
If (winState = -1)
{
WinRestore
WinActivate
}
}
}
Else
{
run ahk_exe Teams.exe
WinWait,Teams
WinActivate
}
return
但是,似乎第 24 行 (run ahk_exe Teams.exe
) 导致了问题。当我运行 windowSpy 时,我得到以下信息:
当我用 ahk_exe Teams.exe
替换 ahk_pid 6440
时,我遇到了同样的问题。有没有其他人遇到过这个问题并找到了解决方法?
解决方法
我觉得其中一些术语需要澄清一下:
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。
这是从 Teams.exe
中的默认安装位置启动 Teams 应用程序 (C:\Users\[YOUR USER NAME HERE]\appdata\local\Microsoft\Teams\current\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 的同一个 ahk_class
块中同时使用 WinTitle 和 ""
参数),至少在这种情况下,使用 ahk_class 可能不会成为最好的选择。在 OP 提供的 Windows Spy
屏幕截图中,我们可以看到 ahk_exe
的 Teams.exe
比 ahk_class
的 Chrome_WidgetWin_1
更具体。因此,可以使用 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
这比平时长了一点,但我希望这会有所帮助。再次重申,如果您有任何问题/意见/疑虑,或者只是想获得更多说明,请随时提出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。