- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Windows 11 上的 Python 3.10.5 中使用 win32gui 模块,我想创建一个简单的窗口切换应用程序。首先,我列出了所有正在运行的窗口的 hwnd,然后在代码的其他地方使用给定的 hwnd 切换到其中一个窗口。代码的相关和简化部分如下所示:
def winEnumHandler(hwnd, ctx):
if win32gui.IsWindowVisible(hwnd):
windows.append(hwnd)
def switchToWindow(hwnd):
win32gui.SetForegroundWindow(hwnd)
def main():
windows = []
win32gui.EnumWindows(winEnumHandler, None)
main()
如果我使用 wxPython 模块构建的 Python 应用程序在前台,并且当我想切换到我的 Python 应用程序以外的窗口时,代码可以正常工作,但无论何时,在前台有另一个应用程序,我都想切换回我的应用程序的主框架或运行 Python 应用程序的 Windows 命令行,我收到以下错误:
Exception in thread Thread-2 (showSwitcher):
Traceback (most recent call last):
File "C:\Users\asamec\AppData\Local\Programs\Python\Python310-32\lib\threading.py", line 1016, in _bootstrap_inner
self.run()
File "C:\Users\asamec\AppData\Local\Programs\Python\Python310-32\lib\threading.py", line 953, in run
self._target(*self._args, **self._kwargs)
File "c:\Users\asamec\Dropbox\DIY\Python\WinSwitcher\WinSwitcher\src\WinSwitcher.py", line 207, in showSwitcher
self.switchToApp(app)
File "c:\Users\asamec\Dropbox\DIY\Python\WinSwitcher\WinSwitcher\src\WinSwitcher.py", line 165, in switchToApp
self.switchToWindow(hwnd)
File "c:\Users\asamec\Dropbox\DIY\Python\WinSwitcher\WinSwitcher\src\WinSwitcher.py", line 172, in switchToWindow
win32gui.SetForegroundWindow(hwnd)
pywintypes.error: (5, 'SetForegroundWindow', 'Access is denied.') t
所以问题是:如何绕过“访问被拒绝”异常,以及为什么在仅从另一个窗口切换到我在后台运行的 Python 应用程序窗口的情况下抛出它,而不是在从我的应用程序切换时抛出前台窗口到其他窗口?
根据为这篇文章提供的第一个答案,看起来由于 Windows 系统限制,使用 win32gui 模块及其 API 无法进行所需的窗口切换。那么问题是:即使 Python 应用程序未在前台运行,是否还有另一种方法如何切换到特定窗口?我问是因为如果进程 PID 已知,使用 pywinauto Python 模块实际上可以使用以下代码进行这种切换:
from pywinauto import Application
app = Application().connect(process=pid)
app.top_window().set_focus()
我不想使用上述采用 pywinauto 模块的代码的最初原因是我认为它执行缓慢,但是,我发现性能问题出在代码的其他部分。因此我将这个问题的第一个答案标记为已接受,因为它也回答了我的后续问题,即:为什么 pywinauto 方法不受 Windows 系统限制的影响?
公认的 anser 提供了一种解决方案,不需要所需应用程序的 PID 和相关的 pywinauto 方法来切换到该应用程序。相反,它提供了一种切换到所需窗口的解决方案,而不是通过窗口的 hwnd 进行应用,这实际上是问题的初衷。答案也解释了绕过Windows系统窗口切换限制的解决方法是在运行win32gui.SetForegroundWindow(hwnd)
方法之前将鼠标指针移出屏幕的技巧。
最佳答案
这是操作系统的限制。微软的documentation详细解释了何时阻止使用 SetForegroundWindow
设置前景窗口:
The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:
- The process is the foreground process.
- The process was started by the foreground process.
- The process received the last input event.
- There is no foreground process.
- The process is being debugged.
- The foreground process is not a Modern Application or the Start Screen.
- The foreground is not locked (see LockSetForegroundWindow).
- The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
- No menus are active.
An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user.A process that can set the foreground window can enable another process to set the foreground window by calling the AllowSetForegroundWindow function. The process specified by dwProcessId loses the ability to set the foreground window the next time the user generates input, unless the input is directed at that process, or the next time a process calls AllowSetForegroundWindow, unless that process is specified.
其他详细信息
pywinauto
在调用 SetForegroundWindow
时受到相同的限制。但是,他们通过将鼠标位置设置为屏幕外的点来解决这个问题。然后再次调用SetForegroundWindow
即可成功。由于pywinauto
是开源的,你也可以看看对应的code snippet .
测试
当写字板实例和任务管理器窗口同时打开时,将执行以下程序。这适用于选择第二个窗口,因为鼠标已移出屏幕。如果鼠标移动被注释掉,则会出现 Access is denied.
错误。
当然,这需要 pywinauto import mouse
,但它允许以这种方式轻松演示功能。
import win32gui
import win32con
from pywinauto import mouse
from time import sleep
def foreground(window_title):
hwnd = win32gui.FindWindow(None, window_title)
win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
win32gui.SetForegroundWindow(hwnd)
if __name__ == "__main__":
foreground("Document - Wordpad")
sleep(1)
#if you comment the next line you will get a 'Access is denied.' error
mouse.move(coords=(-10000, 500))
foreground("Task Manager")
关于Windows 上的 Python : "Access is denied" sometimes when calling win32gui. SetForegroundWindow(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73242440/
我有一个无 GUI 的服务器(没有任何桌面环境或 Ubuntu 服务器的新鲜 Debian,没有 X 服务器,先验)。 我考虑安装 docker 并拉取一个基于官方 Ubuntu 的容器,并在其上添加
我正在构建一个带有临时用户名系统的简单聊天服务器。当屏幕弹出时,首先会出现一个简单的屏幕,询问您的用户名。你可以放入任何你想要的东西,这纯粹是暂时的(我也在尝试)。代码告诉程序继续,将用户名保存到代码
我想将来自其他类的图像显示到 QLabel 中,但要通知 GUI 有一个新的框架可用。我需要从非 GUI 类和非 GUI 线程发出信号。 有什么办法吗? 最佳答案 signal 可以从任何继承QObj
我正在用 Java 编写一个图形用户界面,它有一些按钮,其中一个按钮是选项。我想要它,所以当您单击选项时,它会将 gui 更改为我的选项 gui,而不是在另一个窗口中打开它。 我该怎么做? 最佳答案
标题说明了一切...我和我的 friend 正在这样做,我们不知道为什么 Ball.java 实际上没有在 gamePanel 中制作球,然后制作 GUI。顺便说一句,这是 8 球台球。这是代码: 驱
我正在使用 GUI 构建器,我想知道是否有一种简单的方法可以通过当前主窗口打开寄存器窗口(引用下面的页面)。我正在尝试通过菜单栏来执行此操作。 我一整天都在尝试,因为 GUI Builder 生成了一
我有一个程序使用了许多隐藏的 GUI 组件。例如,所有菜单项和打印机对话框/组件(仅占用至少 50 毫秒)。总的来说,我猜整个程序启动的大约 300 毫秒(或 40%)要归功于所有隐藏的东西。 我想做
我对 GUI 构建比较陌生。 我想制作一个带有按钮(我已经有了)的 GUI,用户可以按下该按钮并选择一个图像,然后动态地将该图像加载到面板中的 GUI 中。我希望每次用户浏览图像时图像都动态变化。 到
我有两年使用 Java 和 Visual Studio 进行企业应用程序编程的经验,而且我是 Python 和 wxPython 的新手。所以我的问题是:wxPython 能否为我提供足够丰富的 GU
这是我启动 mkvtoolnix-gui 时遇到的错误: mkvtoolnix-gui: symbol lookup error: mkvtoolnix-gui: undefined symbol:
我在初始屏幕上有一些最近使用的存储库,我想删除它们,因为我不再使用它们了。如何删除它们? 操作系统 = Windows 7 我查看了注册表并搜索了 git 目录,但找不到最近使用列表的存储位置。 最佳
我正在尝试在 matlab、GUI 中用户输入点作为输入和它们之间的连接。 我有 5 个 matlab 文件 - screen1.m、screen2.m、screen3.m、screen4.m、glo
我用java制作了一个客户端/服务器程序,我已经按照我想要的方式使用cmd完美地工作了,现在我正在尝试将代码的客户端转换为GUI,但是我在打印时遇到问题客户端消息并从文本字段和服务器消息读取客户端输入
我正在制作一种 CRUD 应用程序(Java GUI,MYSQL)我应该: 将数据从数据库加载到List(例如),然后将List加载到GUI 将数据从数据库加载到对象(具有 SQL 表等属性)和对象到
我正在开发一个有 5 个图形用户界面窗口的 Java 应用程序,其中一个是问候窗口或主窗口,我已经完成了所有逻辑部分的工作,我已经完成了 99.99%,唯一剩下的就是我如何以这种方式编码,当我点击一个
我目前正在开发 GUI。 我选择将我的 GUI 基于 bluej 项目 - Scribble。 当您创建 ScribbleGUI 对象时,DrawDemo 类会创建一个同时自动打开的 Canvas 。
在这里阅读了很多关于多进程、管道等的内容后,我还没有找到答案,但如果它已经存在,我深表歉意。 我有一个外围硬件,我正在尝试为其创建一个 GUI。我想让 GUI 使用来自外围设备的数据不断更新,同时仍保
我想做的是将 GUI 从一个单独文件中的类链接到另一个类。我的第一个类是一个主菜单,它将显示一些链接到另一个窗口的按钮。第二个类显示不同的窗口,但我现在遇到的问题是我不知道如何链接第一个类中的按钮来调
我的 GUI 代码中有一个奇怪的行为。如果用户在短时间内产生大量事件,则可能会发生正在运行的事件处理程序方法被另一个事件处理程序方法中断。由于一切都在同一个线程(GUI 线程)中运行,所以一切都应该按
这是一个涉及风格的问题。我正在寻找可以帮助我解决常见 GUI 设计问题 的想法。该应用程序是在 Winforms 中完成的,宁愿使用 WPF,该应用程序已经完成,但我是一个完美主义者,在与其他人合作时
我是一名优秀的程序员,十分优秀!