如何获取Windows中活动Google Chrome标签的网址?

时间:2012-07-25 07:56:56

标签: python winapi google-chrome

我的Python脚本如何获取Windows中当前活动的Google Chrome标签的网址?这必须在不中断用户的情况下完成,因此不能选择发送复制/粘贴的击键。

3 个答案:

答案 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还是很陌生,所以如果评论不合时宜,我深表歉意。

看过之后:

  • 直接启动chrome:// History,
  • 进行一些键盘仿真:使用Pywinauto复制/粘贴
  • 根据DevTool的“网络”标签尝试使用SOCK_RAW连接捕获标头(这一点非常有趣),
  • 试图获取omnibus / searchBar窗口元素的文本,
  • 关闭并重新打开Chrome以读取历史记录表, ....

当缺少窗口标题(使用hwnd + win32检索)时,我将历史记录文件本身(\ AppData \ Local \ Google \ Chrome \ User Data \ Default \ History)复制/粘贴到我的应用程序文件夹中来自“我的”网址表。 即使sqlite db已锁定并且不影响用户体验,也可以这样做。

非常基本的解决方案,需要:sqlite3,psutil,win32gui。 希望有帮助。