我的Python脚本如何获取Windows中当前活动的Google Chrome标签的网址?这必须在不中断用户的情况下完成,因此不能选择发送复制/粘贴的击键。
答案 0 :(得分:16)
首先,您需要下载并安装pywin32。在脚本中导入这些模块:
import win32gui
import win32con
如果Google Chrome是当前活动的窗口,请首先通过以下方式获取窗口句柄:
hwnd = win32gui.GetForegroundWindow()
(否则,请使用win32gui.FindWindow
查找Google Chrome窗口句柄。Windows Detective在查找Windows的类名时非常方便。)
获取网址的唯一方法是获取"omnibox" (address bar)中的文字。这通常是标签的URL,但也可以是用户当前正在键入的任何部分URL或搜索字符串。
此外,多功能框中的URL不包含“http://”前缀,除非用户已明确键入(并且尚未按下输入),但它实际上将包含“https://”或“ftp://”如果使用这些协议。
因此,我们在当前Chrome窗口中找到了多功能框子窗口:
omniboxHwnd = win32gui.FindWindowEx(hwnd, 0, 'Chrome_OmniboxView', None)
如果谷歌Chrome团队决定重命名他们的窗口类,这当然会中断。
然后我们得到了多功能框的“窗口文本”,这对我来说似乎不适用于win32gui.GetWindowText
。好的东西有另一种方法可行:
def getWindowText(hwnd):
buf_size = 1 + win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0)
buf = win32gui.PyMakeBuffer(buf_size)
win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, buf)
return str(buf)
这个小函数将WM_GETTEXT消息发送到窗口并返回窗口文本(在这种情况下,是多功能框中的文本)。
你去吧!
答案 1 :(得分:3)
克里斯蒂安的回答对我不起作用,因为Chrome的内部结构完全改变了,你不能再使用win32gui访问Chrome窗口的元素了。
我设法找到的唯一可行方法是通过UI Automation API,其中this python wrapper包含一些使用示例
运行此选项并切换到您要从中获取地址的Chrome窗口:
from time import sleep
import uiautomation as automation
if __name__ == '__main__':
sleep(3)
control = automation.GetFocusedControl()
controlList = []
while control:
controlList.insert(0, control)
control = control.GetParentControl()
if len(controlList) == 1:
control = controlList[0]
else:
control = controlList[1]
address_control = automation.FindControl(control, lambda c, d: isinstance(c, automation.EditControl) and "Address and search bar" in c.Name)
print address_control.CurrentValue()
答案 2 :(得分:0)
我对StackOverFlow还是很陌生,所以如果评论不合时宜,我深表歉意。
看过之后:
当缺少窗口标题(使用hwnd + win32检索)时,我将历史记录文件本身(\ AppData \ Local \ Google \ Chrome \ User Data \ Default \ History)复制/粘贴到我的应用程序文件夹中来自“我的”网址表。 即使sqlite db已锁定并且不影响用户体验,也可以这样做。
非常基本的解决方案,需要:sqlite3,psutil,win32gui。 希望有帮助。