В моем приложении есть встроенный элемент управления 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, я позаботился о том, чтобы сообщения поступали в окно элемента управления, но, похоже, их игнорируют.
Второй вызывает метод focus () IHtmlWindow2.
IHTMLDocument2* pHTMLDoc2 = NULL;
m_webBrowser->get_Document((IDispatch**)&pHTMLDoc2);
IHTMLWindow2* pWindow = 0;
pHTMLDoc2->get_parentWindow(&pWindow);
pWindow->focus();
На этот раз я получаю E_FAIL от focus ().
MSDN говорит, что вызов может завершиться неудачно, когда документ еще не загружен, но pHTMLDoc2-> get_readyState () возвращает «complete». Так что это не так.
Третий делает глагол UIACTIVATE.
hret = m_oleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL,
clientSite, 0, (HWND)GetHWND(), &posRect);
Кажется, это ничего не дает.
Четвертый - это вызов focus () IHtmlDocument4.
IDispatch* pdisp = NULL;
m_webBrowser->get_Document((IDispatch**)&pdisp);
IHTMLDocument4* pHTMLDoc4 = NULL;
pdisp->QueryInterface(IID_IHTMLDocument4, (void**)(&pHTMLDoc4));
pHTMLDoc4->focus();
ничего не делает.
Я уже потратил на это целый день и теперь знаю ссылки Google наизусть :) Надеюсь на подсказку экспертов.