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