3

In my application I have an embedded MSHTML control. The problem is that I cannot set focus to this control. I can click, select, push buttons etc, but it won't accept keyboard input and mouse wheel notifications as a result. Even left-clicks on the control do not set the focus. (The question is related to this issue.)

Ultimately, I've tried 4 approaches. (Error handling is omitted here for brevity.) The first is sending WM_SETFOCUS to the control.

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);
    }
}

Using Winspector, I made sure that the messages came through to the control's window, but it seems to ignore them.

The second is calling the focus() method of IHtmlWindow2.

    IHTMLDocument2* pHTMLDoc2 = NULL;
    m_webBrowser->get_Document((IDispatch**)&pHTMLDoc2);

    IHTMLWindow2* pWindow = 0;
    pHTMLDoc2->get_parentWindow(&pWindow);
    pWindow->focus();

This time, I get E_FAIL from focus().

MSDN says that the call may fail when the document hasn't loaded, but pHTMLDoc2->get_readyState() returns "complete". So this isn't the case.

The third is doing the UIACTIVATE verb.

    hret = m_oleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, 
        clientSite, 0, (HWND)GetHWND(), &posRect);

This seems to achieve nothing.

The fourth is calling focus() of IHtmlDocument4.

    IDispatch* pdisp = NULL;
    m_webBrowser->get_Document((IDispatch**)&pdisp);

    IHTMLDocument4* pHTMLDoc4 = NULL;
    pdisp->QueryInterface(IID_IHTMLDocument4, (void**)(&pHTMLDoc4));

    pHTMLDoc4->focus();

Does nothing.

I've spent a full day on this already and know google's links by heart now :) Hoping for a hint from experts.

4

1 に答える 1

2

最後にそれを見つけました。

私のコード (または wxWidgets ライブラリの IEHtmlWin コンポーネント) のこの関数は、S_FALSE を返しました。リターン コードを S_OK に変更しました。

HRESULT FS_IOleInPlaceSiteWindowless::RequestUIActivate() { S_OK を返します。}

于 2010-09-24T13:45:40.180 に答える