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.