【发布时间】:2016-09-26 08:52:45
【问题描述】:
我正在尝试在 Windows 中运行 python 脚本以将 F5 命令发送到 Google Chrome v53 窗口。但不幸的是,什么也没发生。但它对Internet Explorer v11 的作用就像一个魅力(在更改Class Name 之后)。
- Winspector detects the
Class Nameof the Google Chrome window - Python 找到窗口并发送命令
- 没有消息被记录为发送到进程
Python 代码
import win32gui, win32api, win32con
hwnd = win32gui.FindWindow("Chrome_WidgetWin_1", None)
print hwnd
# Sending command to the main windows also does not work
win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_F5, 0)
hwnd = win32gui.FindWindowEx(hwnd, None, "Chrome_RenderWidgetHostHWND", None)
print hwnd
win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_F5, 0)
Python 输出
1181972
0
编辑:包括隐藏窗口
There seems to be more windows, that have the same Class Name. 因此,我现在不仅搜索Class Name,还搜索Text。第一次尝试只找到了一个没有孩子的窗口。因此输出的第二行有一个0。
修改后的 Python 代码
import win32gui, win32api, win32con
hwnd = win32gui.FindWindow("Chrome_WidgetWin_1", "Stack Overflow - Google Chrome")
print hwnd
# Sending command to the main windows also does not work
win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_F5, 0)
hwnd = win32gui.FindWindowEx(hwnd, None, "Chrome_RenderWidgetHostHWND", None)
print hwnd
win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_F5, 0)
Python 输出
1247302
1509536
编辑:SetForegroundWindow 解决方案
解决问题的方法是先通过win32gui.SetForegroundWindow(Handle)方法将窗口设置为前台,然后发送键盘命令。
但仍然没有命令传递到窗口,网站也没有刷新。
【问题讨论】:
-
可能与 Chrome 在单独的进程中运行每个标签页有关。
-
@ElmoVanKielmo:谢谢你的提示,我刚刚更新了我的问题。不幸的是,它没有帮助。
-
您没有使用 UI 自动化来触发 重新加载此页面 按钮的原因是什么?该按钮显示在可访问的树中,因此可以与 UI 自动化一起使用。
-
@IInspectable:该问题的解决方案是在发送命令之前将窗口设置为前台(参见最新编辑)。我实际上正在进一步使用浏览器的 CEF 版本,因此没有可访问的自动化按钮。因此,我想在后台发送命令。
-
我希望您了解适用的限制,当一个进程可以成功调用SetForegroundWindow。另请记住,您不是发送命令。你在伪造输入,而且 - 众所周知 - you can’t simulate keyboard input with PostMessage。
标签: python google-chrome winapi winspector