微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Autohotkey 未加载 MS Teams

如何解决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 时,我得到以下信息:

WindowSpy UI

当我用 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,我可以更新):

  1. 如果 Teams 正在运行且当前窗口处于活动状态,请将其最小化。
  2. 如果 Teams 正在运行,但不是活动窗口,请将其设为活动窗口
  3. 如果 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_exeTeams.exeahk_classChrome_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 举报,一经查实,本站将立刻删除。