Установить фокус на встроенный MSHTML - PullRequest
3 голосов
/ 18 ноября 2008

В моем приложении есть встроенный элемент управления 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 наизусть :) Надеюсь на подсказку экспертов.

1 Ответ

2 голосов
/ 24 сентября 2010

Наконец нашел его.

Эта функция в моем коде (точнее, компонент IEHtmlWin для библиотеки wxWidgets) вернула S_FALSE. Я изменил код возврата на S_OK - и вуаля ...

HRESULT FS_IOleInPlaceSiteWindowless :: RequestUIActivate () { возврат S_OK; }

...