2017-01-30 1 views
0

私はInternet Explorer 11をC++アプリケーションに組み込みました。これは、外部オブジェクトの私の実装を返しGetExternalを除いて、元の実装にすべてのメソッドを通過IEleのIOleClientSite実装がWM_KEYUPを失うWM_KEYDOWNイベント

IDocHostUIHandler

:私は、次のインターフェイスを実装しています。

IOleClientSite

これは、元の実装に至るすべてのメソッドを通過します。要求された場合、QueryInterface実装はIDocHostUIHandlerを返します。また、IUnknownのためにそれ自体を返します。 他のインターフェイスの要求を元のIOleClientSiteの実装に渡してみましたが、これは以下の問題には影響しません。

DOMイベントを処理して起動する目的で、現在のドキュメントにイベントシンクを添付しましたが、これは問題の一部ではないと確信しています。

問題は、ブラウザがWM_KEYDOWNとWM_KEYCHARメッセージを無視している(これらはDOMイベントとして解雇されることはありません)が、私は私のIOleClientSiteの実装を挿入しない場合は(DOMのキー押下イベントとして起動されます。)WM_CHARメッセージ に応えるということですこれらのイベントは適切に処理されます。したがって、私はIOleClientSiteの実装にいくつかの抜けがあることをかなり確信しています。 実装のIDocHostUIHandlerを提供するためにIOleClientSiteを実装する必要があることを理解しています(つまり、そのインターフェイスの実装を挿入する方法は他にありません)。 WM_KEYDOWNおよびWM_KEYCHARメッセージは無視されます。

他のすべてが正しく動作していることに注意してください。 JavaScriptから外部オブジェクトのメソッドを呼び出すことはできますが、イベントシンクでDOMイベントを受け取ることができ、イベントをDOMに送信できます。

価値があるのは、基礎となるサイトがQT 3.3 QAxWidgetによって提供されていることです。私はこれが時代遅れであることを認識しています。この作業は最終的にこの古いコードへの依存を取り除くことを意図しています。それにもかかわらず、IOleClientSiteが削除されたときにブラウザが正しく動作するため、QAxWidget実装で問題が発生するとは考えられません。

+0

埋め込みIE11コントロールで[WM \ _KEYUPおよびWM \ _KEYDOWNのメッセージが失われる可能性があります](http://stackoverflow.com/questions/40977258/wm-keyup-and-wm-keydown-messages-lost-in-組み込まれた-11制御) – acelent

答えて

0

これは2つの問題の組み合わせであることが判明しました。ブラウザを含むQAxWidgetは、派生クラスでTranslateKeyEventを実装する必要があります。また、Qt3.3が壊れているため、IOleClientSiteの実装を提供することはできません。内部的には、新しい実装ではなく独自の実装を参照し続けます。 setDocHostUIHandler関数を追加するためにQAxWidgetを修正し、QueryInterfaceを修正してこれを返さなければなりませんでした。したがって、既定のIOleClientSiteは、IID_IDocHostUIHandlerの正しいインターフェイスを返します。

関連する問題