我正在使用嵌入式 web browser control在基于对话框的 MFC 窗口中,我需要知道其中的 Web 浏览器控件的 HWND。我能够找到以下声称可以检索它的代码:
HWND hWndWebBrowser = NULL;
LPUNKNOWN unknown = m_browser.GetControlUnknown();
IWebBrowser2* pWB = NULL;
if(SUCCEEDED(unknown->QueryInterface(IID_IWebBrowser2,(void **)&pWB)))
{
CComPtr<IServiceProvider> pServiceProvider;
if (SUCCEEDED(pWB->QueryInterface(IID_IServiceProvider, (void**)&pServiceProvider)))
{
CComPtr<IOleWindow> pWindow;
if (SUCCEEDED(pServiceProvider->QueryService(SID_SShellBrowser, IID_IOleWindow, (void**)&pWindow)))
{
SHANDLE_PTR hBrowser = 0;
if (SUCCEEDED(pWindow->GetWindow(&hBrowser)))
{
hWndWebBrowser = (HWND)hBrowser;
}
}
}
}
if(unknown)
{
unknown->Release();
}
但问题是当它运行时,它返回一个句柄,但不是我期望的那个。说明它的最佳方式是使用此 Spy++ 屏幕截图:
我知道我可以使用 EnumChildWindows并寻找带有 Internet Explorer_Server
类的窗口,但我有点担心使用这个未记录的类名。
有没有人有更好的方法来检索该(网络浏览器)窗口句柄?
最佳答案
根据 Obtaining the HWND for the WebBrowser control ,您可以使用以下函数来检索 HWND。
IOleWindow *pOWin;
HWND hBWnd;
HRESULT hRes = m_pBrowserApp->QueryInterface(IID_IOleWindow, (void **)&pOWin);
if (SUCCEEDED(hRes)) {
hRes = pOWin->GetWindow(&hBWnd);
if (SUCCEEDED(hRes)) {
// Place hBWnd-manipulating code here
}
pOWin->Release(); // Missing from the MS example
}
因为类名(Shell DocObject View
和 Internet Explorer_Server
)可能会改变,所以上面的代码应该是首选,尽管考虑到 Internet Explorer 是现已停产。
关于c++ - 如何在 MFC 中获取嵌入式 Web 浏览器控件的 HWND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664282/