【问题标题】:Autohotkey not loading MS TeamsAutohotkey 未加载 MS Teams
【发布时间】:2021-09-21 14:14:50
【问题描述】:

我正在尝试运行 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_pid 6440 替换 ahk_exe Teams.exe 时,我遇到了同样的问题。有其他人遇到过这个问题并找到解决方法吗?

【问题讨论】:

    标签: windows-10 autohotkey microsoft-teams


    【解决方案1】:

    我觉得其中一些术语需要澄清一下:

    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 并且我可以更新):

    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 的同一 "" 块中同时使用 WinTitle 和 ahk_class 参数),至少在这种情况下,使用 ahk_class 可能不是最佳选择可用的。在 OP 提供的Windows Spy 截图中,我们可以看到Teams.exeahk_exeChrome_WidgetWin_1ahk_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
    

    这比平时长了一点,但我希望这会有所帮助。再次重申,如果您有任何问题/意见/疑虑,或者只是想了解更多信息,请随时提出。

    【讨论】:

    • 您可以将[YOUR USER NAME HERE] 替换为%A_UserName%,这将从Windows 中提取当前登录用户的名称。只需将字符串与 C:\Users\%A_UserName%\appdata\local\Microsoft\Teams\current\Teams.exe 之类的变量连接在一起
    • 此解决方案似乎仅在应用当前未运行时才有效。如何将它与IfWinExist()WinRestore() 一起使用来调出当前正在运行的窗口?
    • 我更新了我的解决方案以与您的原始代码集成。当我这样做时,我意识到我的原始解决方案不安全,最终破坏了我的 Teams 安装。我非常感谢您要求我重新访问此代码的后续行动;否则这可能会在未来被忽视并破坏其他 ppl 的团队。但无论如何,如果你有更多的后续,请lmk!
    猜你喜欢
    • 2021-10-14
    • 2021-11-28
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2021-04-01
    相关资源
    最近更新 更多