私のWindowsフォームアプリケーションでは、ボタンを押すたびに1つの特別なボタンでテストを実行したいと思います。数十のコントロールがあるため、それぞれに実装するには時間がかかりすぎます。
ホットキーを設定する方法はありますか?アプリケーションで何をしていても、キーを押すとイベントが発生しますか?
ProcessCmdKeyコントロールまたはフォームのいずれかで、ホットキーをオーバーライドして処理できます。
MSDNから:
ProcessCmdKeyメソッドは、最初にコントロールにContextMenuがあるかどうかを判断し、ある場合は、ContextMenuがコマンドキーを処理できるようにします。コマンドキーがメニューショートカットではなく、コントロールに親がある場合、キーは親のProcessCmdKeyメソッドに渡されます。正味の効果は、コマンドキーがコントロール階層の上位に「バブル」されることです。ユーザーが押したキーに加えて、キーデータは、キーと同時に押された修飾キーがある場合はそれも示します。修飾キーには、Shiftキー、Ctrlキー、およびAltキーが含まれます。
例えば:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// if it is a hotkey, return true; otherwise, return false
switch (keyData)
{
case Keys.Control | Keys.C:
// do something
return true;
default:
break;
}
return base.ProcessCmdKey(ref msg, keyData);
}
フォームのProcessCmdKey()メソッドをオーバーライドできます。このメソッドは、フォーム上のコントロールがキーストロークを認識する前に実行されます。これをアプリケーションレベル(すべてのフォーム)で行う必要がある場合は、メインフォームにIMessageFilterインターフェイスを実装させる必要があります。例えば:
public partial class Form1 : Form, IMessageFilter {
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
}
public bool PreFilterMessage(ref Message m) {
// Catch WM_KEYDOWN message
if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) {
MessageBox.Show("Help me!");
return true;
}
return false;
}
}
フォームが1つしかない場合。Form.KeyPreview = trueを設定してから、フォームのキーイベントにコードを追加できます。