Frage

In meiner Anwendung habe ich eine eingebettete MSHTML Steuerung. Das Problem ist, dass ich nicht den Fokus auf diese Kontrolle einstellen. Ich kann klicken, wählen, Taster usw., aber es wird nicht die Tastatureingabe und Mausrad-Benachrichtigungen als Ergebnis akzeptieren. Auch Links-Klicks auf die Steuerung nicht setzen den Fokus. (Die Frage ist im Zusammenhang href="https://stackoverflow.com/questions/296548/embedded-mshtml-mouse-wheel-ignored"> dieses Problem )

Am Ende, ich habe 4 Ansätze ausprobiert. (Fehlerbehandlung wird hier der Kürze halber weggelassen.) Die erste WM_SETFOCUS an die Steuerung sendet.

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

Mit Winspector, stellt mir sicher, dass die Nachrichten, die über die direkte Kontrolle durch das Fenster kamen, aber es scheint, sie zu ignorieren.

Der zweite ist der Aufruf den Fokus () -Methode von IHTMLWindow2.

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

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

Dieses Mal ich E_FAIL von Fokus ().

MSDN sagt, dass der Anruf fehlschlagen, wenn das Dokument nicht geladen ist, aber pHTMLDoc2-> get_readyState () gibt „vollständig“. So ist dies nicht der Fall ist.

Die dritte tut das UIACTIVATE Verb.

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

Das scheint nichts zu erreichen.

Der vierte ruft Fokus () von IHTMLDocument4.

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

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

    pHTMLDoc4->focus();

Gibt es nichts.

Ich habe einen ganzen Tag dafür ausgegeben bereits und weiß Links Googles Auswendig jetzt :) für einen Hauch von Experten der Hoffnung.

War es hilfreich?

Lösung

Schließlich fand es.

Mit dieser Funktion in meinem Code (oder vielmehr die IEHtmlWin Komponente für die wxWidgets-Bibliothek) zurück S_FALSE. Ich änderte den Rückgabecode S_OK - und voila ...

HRESULT FS_IOleInPlaceSiteWindowless :: RequestUIActivate () {     Rückkehr S_OK; }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top