【发布时间】:2015-06-22 05:50:46
【问题描述】:
我在基于对话框的 MFC 窗口中使用嵌入的 web browser control,我需要知道其中的 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 类的窗口,但我有点担心使用这个未记录的类名。
有没有人有更好的方法来检索那个(网络浏览器)窗口句柄?
【问题讨论】:
-
听起来有点像 XY 问题。为什么需要那个特定的 HWND?是什么让它特别?因为这可能是你答案的关键。
-
您担心使用类名吗?但是一旦你有了窗口句柄,你应该对你用那个窗口句柄做什么有完全相同的担忧。你打算用它做什么?
-
@DavidHeffernan:该句柄有多种合法用途。这是我头顶上的一个。我需要知道浏览器控件是否有键盘焦点(结果会影响弹出对话框中的选择)所以我这样做
bool bHadFocus = ::GetFocus() == hIEWnd;但要让它工作我需要知道hIEWnd。 -
不是我的意思。我的观点是,如果您担心跨版本的健壮性,那么即使您找到了窗口句柄,这些问题也会存在
-
@DavidHeffernan:是的,我听到了,但不太可能发生。我现在担心的是微软可能会逐步淘汰 IE,因此这个控件可能会有一个新的类名,比如
Spartan_Server之类的。
标签: c++ windows internet-explorer winapi mfc