python-3.x - 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
谢谢你
解决方案
您的程序必须符合以下条件之一才能被允许设置活动窗口(使用 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进行讨论。