在我的应用程序中,我有一个嵌入式 MSHTML 控件。问题是我无法将焦点设置在此控件上。我可以单击、选择、按下按钮等,但结果是它不接受键盘输入和鼠标滚轮通知。即使左键单击控件也不会设置焦点。(这个问题与这个问题有关。)
最终,我尝试了 4 种方法。(为简洁起见,此处省略了错误处理。)首先是向控件发送 WM_SETFOCUS。
HWND iehwnd = ::FindWindowEx (m_oleObjectHWND, NULL,
L"Shell DocObject View", NULL);
if(iehwnd != NULL)
{
iehwnd = ::FindWindowEx (iehwnd, NULL, L"Internet Explorer_Server", NULL);
if(iehwnd != NULL)
{
::PostMessage(iehwnd, WM_SETFOCUS, (WPARAM)GetHWND(), NULL);
}
}
使用 Winspector,我确保消息通过控件的窗口,但它似乎忽略了它们。
二是调用IHtmlWindow2的focus()方法。
IHTMLDocument2* pHTMLDoc2 = NULL;
m_webBrowser->get_Document((IDispatch**)&pHTMLDoc2);
IHTMLWindow2* pWindow = 0;
pHTMLDoc2->get_parentWindow(&pWindow);
pWindow->focus();
这一次,我从 focus() 得到 E_FAIL。
MSDN 说,当文档尚未加载时,调用可能会失败,但 pHTMLDoc2->get_readyState() 返回“完成”。所以事实并非如此。
第三个是做 UIACTIVATE 动词。
hret = m_oleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL,
clientSite, 0, (HWND)GetHWND(), &posRect);
这似乎一无所获。
第四种是调用IHtmlDocument4 的focus()。
IDispatch* pdisp = NULL;
m_webBrowser->get_Document((IDispatch**)&pdisp);
IHTMLDocument4* pHTMLDoc4 = NULL;
pdisp->QueryInterface(IID_IHTMLDocument4, (void**)(&pHTMLDoc4));
pHTMLDoc4->focus();
什么也没做。
我已经花了一整天的时间,现在已经牢记谷歌的链接 :) 希望专家的提示。