12

私のWindowsフォームアプリケーションでは、ボタンを押すたびに1つの特別なボタンでテストを実行したいと思います。数十のコントロールがあるため、それぞれに実装するには時間がかかりすぎます。

ホットキーを設定する方法はありますか?アプリケーションで何をしていても、キーを押すとイベントが発生しますか?

4

3 に答える 3

15

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);
}
于 2010-05-07T18:58:25.587 に答える
4

フォームの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;
    }
}
于 2010-05-07T18:53:16.900 に答える
1

フォームが1つしかない場合。Form.KeyPreview = trueを設定してから、フォームのキーイベントにコードを追加できます。

于 2010-05-07T18:47:55.103 に答える