質問
私のアプリケーションには、MSHTMLコントロールが埋め込まれています。問題は、このコントロールにフォーカスを設定できないことです。クリック、選択、ボタンなどを押すことはできますが、結果としてキーボード入力やマウスホイールの通知を受け付けません。コントロールを左クリックしても、フォーカスは設定されません。 (質問はこの問題に関連しています。)
最後に、4つのアプローチを試しました。 (ここでは、簡潔にするためにエラー処理を省略しています。)1つ目は、WM_SETFOCUSをコントロールに送信することです。
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);
}
}
Winspectorを使用して、メッセージがコントロールのウィンドウに届くことを確認しましたが、それらは無視されるようです。
2番目は、IHtmlWindow2のfocus()メソッドを呼び出しています。
IHTMLDocument2* pHTMLDoc2 = NULL;
m_webBrowser->get_Document((IDispatch**)&pHTMLDoc2);
IHTMLWindow2* pWindow = 0;
pHTMLDoc2->get_parentWindow(&pWindow);
pWindow->focus();
今回は、focus()からE_FAILを取得します。
MSDNは、ドキュメントがロードされていない場合に呼び出しが失敗する可能性があるが、pHTMLDoc2-> get_readyState()は" complete"を返すと述べています。そのため、そうではありません。
3番目はUIACTIVATE動詞を実行しています。
hret = m_oleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL,
clientSite, 0, (HWND)GetHWND(), &posRect);
これは何も達成していないようです。
4番目はIHtmlDocument4のfocus()を呼び出しています。
IDispatch* pdisp = NULL;
m_webBrowser->get_Document((IDispatch**)&pdisp);
IHTMLDocument4* pHTMLDoc4 = NULL;
pdisp->QueryInterface(IID_IHTMLDocument4, (void**)(&pHTMLDoc4));
pHTMLDoc4->focus();
何もしません。
これには既に1日を費やしましたが、Googleのリンクは今では暗記しています:)専門家からのヒントを期待しています。
解決
ようやく見つかりました。
私のコード(またはwxWidgetsライブラリのIEHtmlWinコンポーネント)のこの関数はS_FALSEを返しました。戻りコードをS_OKに変更しました-そして出来上がり...
HRESULT FS_IOleInPlaceSiteWindowless :: RequestUIActivate() { return S_OK; }