gpt4 book ai didi

c++ - 如何在 MFC 中获取嵌入式 Web 浏览器控件的 HWND

转载 作者:可可西里 更新时间:2023-11-01 10:20:40 29 4
gpt4 key购买 nike

我正在使用嵌入式 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++ 屏幕截图:

enter image description here

我知道我可以使用 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 ViewInternet Explorer_Server)可能会改变,所以上面的代码应该是首选,尽管考虑到 Internet Explorer 是现已停产。

关于c++ - 如何在 MFC 中获取嵌入式 Web 浏览器控件的 HWND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664282/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com