0


1

MSHTML IWebBrowser2 - ページイベントをシンクするとキーストロークが失われる

私はMSHTMLを使用している私のアプリケーションに少し問題を抱えています。 件名に記載されているように、高速入力時の奇妙なキーストロークの欠落した動作を除いて、私はすべて動作しています。 イベントをシンクするために使用した方法と関係があるのでしょうか。

詳細:私のアプリケーションはCで書かれた別のプログラムとVisual Studio 2005のMFCです。 このプログラムは、Internet Explorerの現在実行中の(独立した)インスタンスにアタッチし、 `+ IWebBrowser2 `インターフェイスへのポインターを取得し、それを ` CCmdTarget +`型のオブジェクトに渡します。

class CHandler : public CCmdTarget
{
  IWebBrowser2* m_pWebBrowser2;
  DWORD m_dwBrowserCookie;
  …
  DECLARE_DISPATCH_MAP()
};

このクラスはブラウザで何が起こっているのかを追跡します。 次のコマンドでブラウザのイベントをシンクします。

LPUNKNOWN pUnkSink = GetIDispatch(FALSE);
retval = AfxConnectionAdvise((LPUNKNOWN)m_pWebBrowser2, DIID_DWebBrowserEvents2, pUnkSink, FALSE, &m_dwBrowserCookie);

`+ AfxConnectionAdvise +`をコメントアウトすると、キーストロークは失われませんが、イベントは失われません。 私がそれを残すならば、私はイベントをシンクしますが速くタイプするならば時折のキーストロークを逃します。

イベントに接続する方法はいくつかあります( + AtlAdvise +、接続ポイント)が、これが唯一の作業方法です。

任意の提案は素晴らしいでしょう!

2 回答


0


キーストロークを探しているだけの場合は、コントロールをサブクラス化できませんか。


0


カバーの下では、すべてのさまざまな接続方法( + AtlAdvise +、 `+ AfxConnectionAdvise `など)はすべて、 ` IConnectionPointContainer `および ` IConnectionPoint +`を使用します。

これは、IEの実行中のインスタンスに接続する方法と関係があると思われます。 どのようにして `+ IWebBrowser2 `ポインターを取得していますか? あなたはIEプロセスにロードされていますか、それともあなたは別のプロセスですか? ` IWebBrowser2 +`の元のスレッド(IE Tab UIスレッド)とは異なるスレッドで実行している場合、適切なCOMマーシャリングを行っていますか?