1

これはかなり単純に思えますが、私はそれを達成することができませんでした。アプリケーションのすべてのフォームが継承するBaseFormクラスがあります。

BaseFormを継承する任意の形式でキーが押されるたびに、コード行を実行したいだけです。私のBaseFormで、運が悪かったので次のことを試みました。

public class BaseForm : Form
{
     protected override void OnKeyPress(KeyPressEventArgs e)
     {
          //Perform action
     }

}

public class MainForm : BaseForm
{
     //All of my main form code goes here.
}

どんな助けでも大歓迎です!前もって感謝します

4

2 に答える 2

2

おそらく、任意のコントロールからすべてのキーの押下をキャッチできるようにするにKeyPreviewは、基本フォームを設定する必要があります。trueフォームデザイナまたは基本クラスコンストラクタでこれを行うことを検討してください。派生フォームにいくつかのエディター(テキストボックスなど)があると思います。そのため、これらのキーの押下をキャッチできるように、ベースフォームをにKeyPreview設定する必要があります。true

(質問のように)メソッドをオーバーライドするか、基本フォームにイベントOnKeyPressのイベントハンドラーを追加することができます。KeyPress

public class BaseForm : Form
{
     public BaseForm()
     {
         this.KeyPreview = true; //it's necessary!! 

         //or just override the OnKeyPress method instead
         this.KeyPress += new KeyPressEventHandler(BaseForm_KeyPress);
     }

     private void BaseForm_KeyPress(object sender, KeyPressEventArgs e)
     {
         //do your action
     }
}
于 2012-10-10T23:38:21.450 に答える
0

これまでに行ったことは正しいです。OnKeyPressが実行されていない場合は、何か問題があります。干渉しているOnKeyDownがありますか?

次に行うことは、派生フォームで同じオーバーライドを使用することです。

public class MainForm : BaseForm
{
     //All of my main form code goes here.

     protected override void OnKeyPress(KeyPressEventArgs e)
     {
          //do whatever action this form needs to, if any

          base.OnKeyPress(e);
     }
}

base.OnKeyPress?へのその呼び出しを参照してください これにより、ベースにあるコード行が実行されます。その呼び出しは関数内のどこにでも置くことができることに注意してください。フォーム固有のコードの前の最初に呼び出す方が適切な場合があります。

于 2012-10-10T23:07:25.893 に答える