tags:

views:

408

answers:

1

Dear StackOverflow community,

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.

Thanks,

Yaroslav.

A: 

Finally found it.

This function in my code (or rather the IEHtmlWin component for the wxWidgets library) returned S_FALSE. I changed the return code to S_OK - and voila...

HRESULT FS_IOleInPlaceSiteWindowless::RequestUIActivate() { return S_OK; }