2012-02-17 11 views
3

私のアプリケーションでは、キーボードショートカット(イベントハンドラ)をTextBoxに追加しました。 1つはCtrl + Hで、Find & Replaceポップアップが表示されます。私はCtrlキー+ Hのキー入力をチェックし、私のフォームのKeyDownイベントハンドラでKeyDownで、ShowDialogがSuppressKeyPressを機能させない

case Keys.H: 
    ShowFindReplaceDialog(true); // This line makes the SuppressKeyPress not work 
    e.SuppressKeyPress = true; 
    break; 

は今、Ctrlキー+ Hはバックスペースを押すのと同じである標準のキーボードショートカットですので、私は抑える必要がありますそれ。

問題は、ポップアップを表示すると抑制が機能しなくなることです。ポップアップが表示され、閉じた後、バックスペース(Ctrl + H)キーがまだ表示されます。

これをどのように機能させることができますか?

N.B.完全性のために、あなたはMessageBoxでこの同じ問題に遭遇します。それはその下にあるすべてのShowDialogです。

答えて

4

はい、それはShowDialog()を呼び出すためです。これはブロッキングコールなので、のダイアログが閉じられた後でe.SuppressKeyPressステートメントがまで実行されません。また、ShowDialogはメッセージループDoEventsスタイルをポンピングするので、キーストロークメッセージは通常どおり送出され、KeyPressイベントがトリガーされます。

最も簡単な回避策は、メッセージの処理が完了するまでダイアログの表示を遅らせることです。このようにControl.BeginInvoke()でうまくやっています。

case Keys.H: 
    this.BeginInvoke(new Action(() => ShowFindReplaceDialog(true))); 
    e.SuppressKeyPress = true; 
    break; 
関連する問題