• python通过hwnd获得IWebBrowser2(原创)


    项目中用到了查找已打开的ie窗口,通过的解决方法是用ShellWindows,测试了一下该方法获得的ie窗口不全。

    后来想到了通过hwnd来获取,在C++、Delphi等工具中都没有问题,但python总是失败,看了官方的邮件列表也没有解决方案。

    后来从官方的demo中找到灵感,在这里讲该函数分享下:

    SID_STopLevelBrowser = IID('{4C96BE40-915C-11CF-99D3-00AA004AE837}')
    SID_SWebBrowserApp = IID('{0002DF05-0000-0000-C000-000000000046}')
    IID_IWebBrowser2 = IID('{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}')
    
    def getIWebBrowser2ByHwnd(hwnd):
        '''
        通过句柄获取IWebBrowser2对象
        '''
        try:
            msg = win32gui.RegisterWindowMessage('WM_HTML_GETOBJECT')
            ret, result = win32gui.SendMessageTimeout(hwnd, msg, 0, 0, win32con.SMTO_ABORTIFHUNG, 1000)
            ob = pythoncom.ObjectFromLresult(result, pythoncom.IID_IDispatch, 0)
            iHtmlDocument2 = Dispatch(ob)
            iServiceProvider = iHtmlDocument2.parentWindow._oleobj_.QueryInterface(pythoncom.IID_IServiceProvider)
            iWebBrowser2 = Dispatch(iServiceProvider.QueryService(SID_SWebBrowserApp, pythoncom.IID_IDispatch))
            return iWebBrowser2
        except:
            traceback.print_exc()
            return None


    如果按c++里的方式:

    Dispatch(iServiceProvider.QueryService(SID_SWebBrowserApp, IID_IWebBrowser2))

    会报如下错误:

    TypeError: There is no interface object registered that supports this IID


    估计与pythoncom的封装有关,希望对需要的朋友有帮助。

  • 相关阅读:
    webpack篇
    js 中对于this 的理解的 经典案例
    AMD、CMD、CommonJs和es6对比
    vue import异步加载js
    vscode 保存自动 格式化eslint 代码
    git设置
    面向对象的三大特性之继承
    面向对象 类与对象及其属性与方法 类的组合
    hashlib模块 hash算法
    configparser模块 配置文件的解析操作
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3046756.html
Copyright © 2020-2023  润新知