2009-07-13 9 views
4

C#WinFormsアプリケーションにサードパーティのコントロールがロードされています。コントロールがフォーカスを盗むのを防ぐには?

このサードパーティのActiveXコントロールでメソッドを呼び出すと、フォーカスが非同期的にスチールされます。例:

// This call causes 3rd party to spawn a thread and steal focus 
// milliseconds later. 
foo3rdParty.DoSomething(); 

コントロールがフォーカスを奪うのを防ぐ方法はありますか?

+0

おそらく、メッセージのフックを行い、フォーカスの変更を傍受してキャンセルする必要があります。これはコントロールからのかなり失礼な振舞いです。完全に取り除くことはできません。 – MusiGenesis

+0

冗談はない、本当に失礼な行為です。私たちは開発者にこの問題を回避/回避する方法を尋ねました。彼は次のように語っています。「Win32 APIを使用してフォーカスを取り戻す」*問題は、スレッドがフォーカスを奪ったときの通知がないことです。ソル。私たちはこれを開発者に説明しましたが、返答は返されませんでした。 –

+1

彼はなぜ彼のコントロールが最初にフォーカスを奪う必要があるのか​​説明しましたか?合理的な理由があれば、おそらく深刻な問題を隠しているハックフィックスです。私はこれがスペースシャトルライフサポート維持管理のようなものではないことを願っています。 – MusiGenesis

答えて

2

ugh。あなたはおそらくこれを既に考えていますが、ユーザーエクスペリエンスを損なうことなく、フォーカスを取ろうとしている期間(または推測)の間にコントロールのウィンドウを無効にすることはできますか?

+0

おそらく。私はそれを試み、あなたに戻ってきます。 –

+0

私はこれを打ちました。それはうまくいくようです。確かに、それはハックですが、あまりにも醜いではなく、かなり一貫して動作します。提案してくれてありがとう、私はこれを受け入れられた答えとしてマークしています。 –

+0

これは私が抱えている問題であるので、どうしましたか? – Andrea

2

あなたはこのラフなアプローチを試みることができる:あなたが電話をかける前に、Form.ActiveControlを使用して言うフォーカスを持っているかを制御して下さい

  1. を。
  2. フォーカスを失ったときに呼び出されるアクティブなコントロールにハンドラをアタッチします。
  3. サードパーティのコントロールのメソッドを呼び出します。
  4. すべてが正常に実行された場合、サードパーティのコントロールにフォーカスが奪われ、以前フォーカスされたコントロールのフォーカスが失われ、ハンドラが呼び出されます。
  5. そのハンドラでは、前のコントロールにフォーカスを戻すか、スレッドを実行して少し遅くするようにコードをスケジュールするか、
+0

ありがとう、これを試してみました。このサードパーティのActiveXコントロールは、DoSomething()の呼び出しの後に、通常2〜3回、フォーカスを何度も盗み出します。これはあなたの上記のハッキリした解決策を複雑にします。とにかく、ありがとう。 –

3

コントロールにGotFocus()イベントがある場合(フォーカスを盗むたびにコントロールによって正しく生成されます)、ハンドラをアタッチして、フォーカスを持っている最後のコントロールにフォーカスを戻すことができます(またはOKボタンなど)を押します。

これは、誰かがこの中でテキストボックスに入力している場合、奇妙な結果を招くことがあります。私の解決策は、私を助けるために15分の仕事をしたいと思っていた人に私のお金を渡すことです。

+0

ええ、かなりハックシ。私はこれを試して、この期間中にコントロール自体がフォーカスを2〜3回奪うので、このハックは完全には機能しません。 –

3

この悪意のあるコントロールが表示されないようにするには、目に見えないフォーム上に配置し、そこでDoSomething()を呼び出します。フォーカスをつかんだら、誰が気にしますか?

+0

私たちのフォームにあることを恐れる。ああ。 –

関連する問題