知道了IHTMLDocument2接口,怎么获得IWebBrowser2接口
1个回答
2016-01-28 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517196
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
如何从一个窗口句柄获取IWebBrowser2接口
使用完后要调用Release
如果找不到接口,返回NULL
原理:
如果你的系统安装了Microsoft 活动辅助功能(MSAA),则您可以向浏览器窗口
(类名"Internet Explorer_Server")发送WM_HTML_GETOBJECT消息,将消息返回的结果
作为一个参数传递给MSAA函数ObjectFromLresult,从而获取IServiceProvider接口。
IServiceProvider是IWebBrowser2, IDocument2等公共的方法,请重视这个接口
必须包含的头文件
#include <mshtml.h>
#include <oleacc.h>
#include <atlbase.h> //需要安装ATL库
****************************************************************************/
#include <mshtml.h>
#include <oleacc.h>
#include <atlbase.h> //需要安装ATL库
//测试代码中的_bstr_t 需要使用COMUTIL.H>
#include <COMUTIL.H>
#pragma comment(lib,"comsupp.lib")
IWebBrowser2* GetIWebBrowserInterface(HWND BrowserWnd)
{
CoInitialize(NULL); //这句话要放在类的构造函数中
IWebBrowser2* pWebBrowser2=NULL;
HRESULT hr;
// Explicitly load MSAA so we know if it's installed
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst )
{
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( BrowserWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult )
{
CComPtr<IServiceProvider> spServiceProv;
hr = (*pfObjectFromLresult)( lRes, IID_IServiceProvider, 0, (void**)&spServiceProv );
if ( SUCCEEDED(hr) )
{
hr = spServiceProv->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,(void**)&pWebBrowser2);
} // else document not ready
} // else Internet Explorer is not running
::FreeLibrary( hInst );
} // else Active Accessibility is not installed
CoUninitialize(); //这句话要放在类的析构函数中,否则返回值即使不是空指针也无效
return SUCCEEDED(hr) ? pWebBrowser2 : NULL;
}
/****************************************************************************
//调用测试
****************************************************************************/
void CDemoDlg::OnButton2()
{
//获取IE主窗口
HWND ExplorerWnd=::FindWindow(_T("IEFrame"),NULL);
if (!ExplorerWnd)
::MessageBox(m_hWnd,TEXT("没有找打IE窗口"),NULL,MB_OK);
::SetForegroundWindow(ExplorerWnd);
//根据IE主窗口获取浏览器窗口
HWND BrowserWnd=FindWithClassName( ExplorerWnd , _T("Internet Explorer_Server"));
if ( BrowserWnd )
{
IWebBrowser2* pWebBrowser2=GetIWebBrowserInterface(BrowserWnd);
if (pWebBrowser2)
{
//浏览网页
_bstr_t bsSite= "http://www.baidu.com/";
VARIANT vEmpty;
VariantInit(&vEmpty);
pWebBrowser2->Navigate(bsSite, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
//获取窗口
HWND wnd;
pWebBrowser2->get_HWND((LONG*)(&wnd));
pWebBrowser2->Release();
}
}
}
使用完后要调用Release
如果找不到接口,返回NULL
原理:
如果你的系统安装了Microsoft 活动辅助功能(MSAA),则您可以向浏览器窗口
(类名"Internet Explorer_Server")发送WM_HTML_GETOBJECT消息,将消息返回的结果
作为一个参数传递给MSAA函数ObjectFromLresult,从而获取IServiceProvider接口。
IServiceProvider是IWebBrowser2, IDocument2等公共的方法,请重视这个接口
必须包含的头文件
#include <mshtml.h>
#include <oleacc.h>
#include <atlbase.h> //需要安装ATL库
****************************************************************************/
#include <mshtml.h>
#include <oleacc.h>
#include <atlbase.h> //需要安装ATL库
//测试代码中的_bstr_t 需要使用COMUTIL.H>
#include <COMUTIL.H>
#pragma comment(lib,"comsupp.lib")
IWebBrowser2* GetIWebBrowserInterface(HWND BrowserWnd)
{
CoInitialize(NULL); //这句话要放在类的构造函数中
IWebBrowser2* pWebBrowser2=NULL;
HRESULT hr;
// Explicitly load MSAA so we know if it's installed
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst )
{
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( BrowserWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult )
{
CComPtr<IServiceProvider> spServiceProv;
hr = (*pfObjectFromLresult)( lRes, IID_IServiceProvider, 0, (void**)&spServiceProv );
if ( SUCCEEDED(hr) )
{
hr = spServiceProv->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,(void**)&pWebBrowser2);
} // else document not ready
} // else Internet Explorer is not running
::FreeLibrary( hInst );
} // else Active Accessibility is not installed
CoUninitialize(); //这句话要放在类的析构函数中,否则返回值即使不是空指针也无效
return SUCCEEDED(hr) ? pWebBrowser2 : NULL;
}
/****************************************************************************
//调用测试
****************************************************************************/
void CDemoDlg::OnButton2()
{
//获取IE主窗口
HWND ExplorerWnd=::FindWindow(_T("IEFrame"),NULL);
if (!ExplorerWnd)
::MessageBox(m_hWnd,TEXT("没有找打IE窗口"),NULL,MB_OK);
::SetForegroundWindow(ExplorerWnd);
//根据IE主窗口获取浏览器窗口
HWND BrowserWnd=FindWithClassName( ExplorerWnd , _T("Internet Explorer_Server"));
if ( BrowserWnd )
{
IWebBrowser2* pWebBrowser2=GetIWebBrowserInterface(BrowserWnd);
if (pWebBrowser2)
{
//浏览网页
_bstr_t bsSite= "http://www.baidu.com/";
VARIANT vEmpty;
VariantInit(&vEmpty);
pWebBrowser2->Navigate(bsSite, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
//获取窗口
HWND wnd;
pWebBrowser2->get_HWND((LONG*)(&wnd));
pWebBrowser2->Release();
}
}
}
广东轻亿云软件
2024-05-14 广告
2024-05-14 广告
广东轻亿云软件科技有限公司在软件开发领域深耕多年,积累了丰富的经验和技术实力。我们深知API接口在现代软件开发中的重要性,因此,我们与多家业界领先的API接口提供商保持着紧密的合作关系,确保我们的产品和服务能够充分利用这些接口,为用户提供更...
点击进入详情页
本回答由广东轻亿云软件提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询