2009-05-15 9 views
0

私はMSHTMLを使ってアプリケーションに少し問題があります。私は、奇妙なキーストロークを除いて、すべての作業は、件名に記載されているように速く入力するときに欠けている。私はそれが私がイベントをシンクするために使用する方法と関係があるかもしれないと思う?MSHTML IWebBrowser2 - ページイベントが沈んだ場合、キーストロークが逃した?

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


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

このクラスは、ブラウザで何が起こっているかを追跡します。私はAfxConnectionAdviseをコメントアウトした場合


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

は、その後、何のキーストロークが失われていないが、これ以上のイベント:私は、次のコマンドでブラウザのイベントをシンク。私がそれを残すと、私はイベントをシンクしますが、速く入力すれば時折キーストロークを逃します。

イベントに接続する方法はいくつかありますが(AtlAdvise、接続ポイント)、これは私が働くことができる唯一のものでした。

どのような提案も素晴らしいでしょう。

答えて

0

キーストロークを探しているだけなら、コントロールをサブクラス化できませんか?カバーの下側に

+0

私はOPがキーストロークを望んでいるとは思わない。私は彼らがウェブブラウザのイベントを望んでいると思うし、文字を落とさずにキーストロークを動作させたいと思う。 –

+0

それは正しいです、私は本当にキーストロークに興味がありません。しかし、速く入力すると、ユーザーとして迷惑ないくつか落ちる。私はそれが沈んでも問題を解決しないので、私がイベントをシンクする方法のためだとかなり確信しています。 – Brian

0

すべての様々な接続方法(AtlAdviseAfxConnectionAdvise、など)すべてIConnectionPointContainerIConnectionPoint使用 - 彼らはちょうどあなたが定型COMグーを入力して保存しています。

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

+0

私は別のスレッドで実行しています。私は、SHDocVw :: IShellWindowsPtrを使用してIEの実行中のインスタンスにアクセスします。ブラウザのポインタを取得するには、次のコードを使用してロードします。 _variant_t va(index_to_window、VT_I4); spDisp = m_spSHWinds->アイテム(va)。 SHDocVw :: IWebBrowser2Ptr spBrowser(spDisp); spBrowser-> AddRef(); 後で処理するためにspBrowserを保存します。上記の例ではm_pWebBrowser2です。 私はある時点で処理するのを助けるためにスレッドをオフにし、そこでマーシャリングを使用しますが、メインプログラムのスレッドでは使用しません。私はイベントをトラップしない限り正常に動作することは奇妙に思えますか?私はそれを調べます。 ありがとうございます。 – Brian

関連する問題