3 Stimmen

Fokus auf eingebettetes MSHTML setzen

In meiner Anwendung habe ich ein eingebettetes MSHTML-Steuerelement. Das Problem ist, dass ich den Fokus nicht auf dieses Steuerelement setzen kann. Ich kann klicken, auswählen, Schaltflächen drücken usw., aber es akzeptiert keine Tastatureingaben und Mausrad-Benachrichtigungen als Ergebnis. Selbst wenn ich mit der linken Maustaste auf das Steuerelement klicke, wird der Fokus nicht gesetzt. (Die Frage bezieht sich auf diese Ausgabe. )

Letztlich habe ich 4 Ansätze ausprobiert. (Die Fehlerbehandlung wird hier der Kürze halber weggelassen.) Der erste ist das Senden von WM_SETFOCUS an das Steuerelement.

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 habe ich sichergestellt, dass die Nachrichten im Fenster des Steuerelements ankommen, aber es scheint sie zu ignorieren.

Die zweite ist der Aufruf der Methode focus() von IHtmlWindow2.

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

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

Dieses Mal erhalte ich E_FAIL von focus().

MSDN sagt, dass der Aufruf fehlschlagen kann, wenn das Dokument nicht geladen wurde, aber pHTMLDoc2->get_readyState() gibt "complete" zurück. Dies ist also nicht der Fall.

Die dritte Möglichkeit ist die Verwendung des Verbs UIACTIVATE.

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

Das scheint nichts zu bringen.

Die vierte ist der Aufruf von focus() von IHtmlDocument4.

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

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

    pHTMLDoc4->focus();

Macht nichts.

Ich habe bereits einen ganzen Tag damit verbracht und kenne die Google-Links jetzt auswendig :) Ich hoffe auf einen Tipp von Experten.

2voto

user38329 Punkte 729

Endlich gefunden.

Diese Funktion in meinem Code (bzw. der IEHtmlWin-Komponente für die wxWidgets-Bibliothek) gab S_FALSE zurück. Ich änderte den Rückgabewert in S_OK - und voila...

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

0 Stimmen

Vielen Dank für die Mitteilung Ihrer Lösung. Ich hoffe, dass die Hinweise, die Sie mir hier geben, mir bei meinem Problem helfen können. social.msdn.microsoft.com/Forums/de/wpf/thread/

0 Stimmen

Lösung #2 hat bei mir funktioniert. Das Ereignis "window.onfocus" wird ausgelöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X