axacropdf嚥下鍵、それを止める方法は?
質問
AxacropDFは、ショートカット、キープレスなど、フォーカスが得られるとすぐにすべてのキー関連のイベントを飲み込みます。メッセージフィルターを追加しましたが、キー関連のメッセージも表示されません。それはcomコンポーネントです、それは関連する可能性がありますか?
コントロールがそれらを飲み込む前にこれらをキャッチする方法はありますか?
解決
Hansは正しいです、Acrobat Readerは、管理されたコード内から直接アクセスできない2つの子Acrord32プロセスを生み出します。
私はこれを実験しましたが、3つの実行可能なオプションがあります。
aを作成できます グローバルシステムフック, 、次に、wm_setfocusメッセージを探してフィルタリング /応答します。ここのラッパーライブラリなどを使用して、C#内からこれの一部を達成できます。 http://www.codeproject.com/kb/system/wilsonsystemglobalhooks.aspx
また、アプリケーションの複数のインスタンス、またはacrord32の他のインスタンスがある可能性があるため、正しいプロセスを特定する必要があります。これは最も決定論的なソリューションですが、アプリケーションが存在するすべてのウィンドウに送信されたメッセージをフィルタリングするようになるため、プログラムはシステムの安定性に悪影響を与える可能性があるため、このアプローチは一般的にこのアプローチをお勧めしません。
を見つけます 代替PDF表示制御. 。いくつかの商用コンポーネントについては、この答えを参照してください。 .NET PDFビューアコントロール 、またはあなた自身を転がす: http://www.codeproject.com/kb/applications/pdfviewercontrol.aspx
を見つけます 許容可能なハック. 。アプリケーションの堅牢性に応じて、次のようなコードが適している場合があります(私のケースに適していました):
DateTime _lastRenav = DateTime.MinValue; public Form1() { InitializeComponent(); listBox1.LostFocus += new EventHandler(listBox1_LostFocus); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { axAcroPDF1.src = "sample.pdf"; //this will cause adobe to take away the focus _lastRenav = DateTime.Now; } void listBox1_LostFocus(object sender, EventArgs e) { //restores focus if it were the result of a listbox navigation if ((DateTime.Now - _lastRenav).TotalSeconds < 1) listBox1.Focus(); }
他のヒント
私はついに途方もなく簡単な答えを得るかもしれません。これまでのところ、これは機能しています。
かなり長い間この問題に苦しんでいて、各カスタムコントロールの記録の複雑なシステムを構築した後、それらのどれが最後にフォーカスし、タイマーを使用してフォーカスバックをフリップしました(AcropDFがそれをつかんだとき)私はこの問題を再検討し、かなりの数を読みました回答(最近のソリューションを探しています)。収集された情報は、このアイデアに役立ちました。
アイデアは、次の例のように読み込まれている間に(acropdf)コントロールを無効にすることです(明確にするためにコードが削減)
axacropdf_this.enabled = false axacropdf_this.src = m_src
その後、タイマーで、たとえば1秒の後。
axacropdf_this.enabled = false
基本的に、アイデアは、ユーザーが許可されるまでAcropDFコントロールを使用しないようにWindowsに指示することです。そのため、Windowsにフォーカスが得られないように依頼することです(ユーザーはそこに許可されていないため)。
これまでのところ、これは耐えています。何かが変更されれば、これを編集します。それがあなたのために完全に機能しない場合、おそらくアイデアは有用な方向を指しています。
これは、処理不足のcomコンポーネントであり、それが問題です。 setParent()でレイアウトされたWindows SDK要件に完全に違反しています。ウィンドウがフォーカスを取得すると、acroread.exeプロセスのメッセージループがすべてのメッセージを取得し、メッセージフィルターはメッセージを表示できなくなります。
技術的には、setWindowshookex()を使用してDLLをプロセスに挿入し、wh_getMessageでメッセージを監視することにより修正可能です。ただし、C#言語でそのようなDLLを書くことはできません。
大いに吸う、私は知っている。そのプログラムには決して不足していないようです。
何らかの理由で、ティムの答えは、axacropdfコントロールを直接無効にして、私の場合は機能しませんでした。以前に選択されたテキストボックスの休暇イベントも発砲することはありません。
機能しているのは、無効なグループボックス内のaxacropdfコントロールをネストすることです。私のアプリケーションのユーザーは、PDFと対話するのではなくPDFのみを見る必要があるため、GroupBoxの有効化されたプロパティは設計者で虚偽に設定されています。