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

标签 c++ windows internet-explorer winapi mfc

我正在使用嵌入式 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/

相关文章:

javascript - JQuery 不会将 css 规则应用于 IE 6 和 7 上的表格

javascript - IE 中 float 和内联 block 元素的 focusin 事件触发

c++ - 捕获鼠标光标并在 Win32 中应用透明蒙版

c++ - Lambda 回调取决于其参数

c++ - 我怎么知道拓扑排序是否有效?

c++ - 在 Windows 的 GUI 应用程序中使用控制台,仅当它从控制台运行时

c++ - 为什么抛出一个非异常被认为是糟糕的设计?

windows - 如何防止 DLL 注入(inject)

windows - 以除管理员身份之外的任何身份启动 Windows 服务会给出 'Access denied'

css - 仅在 IE 中裁剪框阴影的顶部