首页 > 解决方案 > Win 10:Cmd 可以将窗口带到前台,但任何其他终端都不能(即使提升)。为什么会这样?

问题描述

pygetwindow用来通过它的标题将一个窗口带到前台。如果我从 cmd(和 PowerShell)运行我的 python 脚本,它可以完美运行。但是,如果我从任何其他终端运行它,比如 Alacritty,而不是进入前台,所提到的窗口就会开始在任务栏中闪烁。

为什么会这样?我已将 Alacritty 配置为使用 cmd。

以下是我的代码的相关部分:

import pygetwindow
try:
        window = pygetwindow.getWindowsWithTitle('foobar')[0]
        window.activate()
    except Exception as e:
        #raise e
        print("open foobar please")
        exit(1)

以下是我的 alacritty 配置的相关部分

# Shell
# You can set `shell.program` to the path of your favorite shell, e.g. `/bin/fish`.
# Entries in `shell.args` are passed unmodified as arguments to the shell.
# Default:
#   - (macOS) /bin/bash --login
#   - (Linux/BSD) user login shell
#   - (Windows) powershell
  shell:
    program: cmd.exe
    args:
            - /s /k pushd C:\Users\interesting\bug\hunt\Repos

谢谢你

标签: python-3.xcmdwindows-10setforegroundwindowalacritty

解决方案


您的程序必须符合以下条件之一才能被允许设置活动窗口(使用 API 调用SetForegroundWindow)。

您可能会发现使用 SendKeys 发送系统击键(如 Ctrl+Tab)对您有用,但您需要能够预测您的 z 顺序。

系统限制哪些进程可以设置前台窗口。只有当下列条件之一为真时,进程才能设置前台窗口:

•进程是前台进程。

•进程由前台进程启动。

• 进程收到最后一个输入事件。

•没有前台进程。

• 正在调试进程。

•前台进程不是现代应用程序或开始屏幕。

• 前景未锁定(请参阅 LockSetForegroundWindow)。

• 前台锁定超时已过期(请参阅 SystemParametersInfo 中的 SPI_GETFOREGROUNDLOCKTIMEOUT)。

•没有菜单处于活动状态。

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setforegroundwindow

这些限制的目的是解决程序窃取焦点的问题。所以基本上如果用户点击另一个窗口,用户的选择就会获胜。

启动程序时,程序有两秒钟的时间显示一个窗口。如果用户在程序在两秒钟内显示其窗口之前单击另一个窗口,则该程序仍将成为活动窗口。如果程序花费的时间超过 2 秒并且用户点击离开,则用户的窗口将成为活动窗口。

另请参阅https://devblogs.microsoft.com/oldnewthing/20090220-00/?p=19083进行讨论。


推荐阅读