项目中用到了查找已打开的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的封装有关,希望对需要的朋友有帮助。

 

posted on 2013-04-27 12:02  一个人的天空@  阅读(2078)  评论(0编辑  收藏  举报