質問

私のアプリケーションには、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; }

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top