我如何捕获按键事件?

How can i capture Key press events?

我试图在按下“Ctrl+l”时显示 2 个不同的消息框,在按下“[=] 时显示另一个消息框15=]Shift+A" 也被按下。我已完成所有操作,但是当我在程序 运行 时按下这些按钮时,没有任何反应。我不确定我做错了什么。

我的代码如下:

public Color()
    {
        InitializeComponent();

       ContextMenuStrip s = new ContextMenuStrip();
       ToolStripMenuItem directions = new ToolStripMenuItem();
       directions.Text = "Directions";
       directions.Click += directions_Click;
       s.Items.Add(directions);
       this.ContextMenuStrip = s;
       this.KeyDown += new KeyEventHandler(Color_KeyDown);//Added
    }
    void directions_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Just click on a color chip to see the translation");
    }
    //Keypress
    private void Color_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.L && (e.Control))
        {
            MessageBox.Show("You can choose from four different languages by clicking on the radio buttons");
        }
        else if (e.KeyCode == Keys.A && (e.Shift))
        {
            MessageBox.Show("This is version 1.0");
        }
    }

您是否为您的处理程序 (Color_KeyDown) 订阅了诸如 PreviewKeyDown 之类的事件?我看到您已连接 directions_Click 来监听您的 ToolStripMenuItem 上名为 "directions" 控件的鼠标点击,但从您的代码中,我看不到您在何处监听关键事件。

尝试添加类似于以下内容的行:

myWinFormsControl.PreviewKeyDown += Color_KeyDown;

其中 myWinFormsControl 是 window 或您希望在按键事件触发时调用处理程序的控件。注意:确保在测试时给予控件输入焦点(例如,如果它是一个文本框,它不会触发按键事件,除非文本光标在按下键之前位于内部)。

如果您使用 visual studio,另一个有用的技巧是您可以在设计视图中 select 控件并打开属性窗格并单击小闪电图标以查看所有内容该控件的可用事件。您还可以双击其中一个空销售以添加新的事件处理程序。 (有关详细信息,请参阅 here

从 winforms 中的文本框获取按键事件的快速示例:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        TextBox someTextBox = new TextBox();
        someTextBox.PreviewKeyDown += someTextBox_PreviewKeyDown;

        Form myMainWindow = new Form();
        myMainWindow.Controls.Add(someTextBox);

        Application.Run(myMainWindow);
    }

    static void someTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.L && (e.Control))
        {
            MessageBox.Show("You can choose from four different languages by clicking on the radio buttons");
        }
        else if (e.KeyCode == Keys.A && (e.Shift))
        {
            MessageBox.Show("This is version 1.0");
        }
    }
}

并且只是在表单级别上捕捉(也就是只要 window 具有输入焦点):

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Form myMainWindow = new Form();
        myMainWindow.PreviewKeyDown += myForm_PreviewKeyDown;

        Application.Run(myMainWindow);
    }

    static void myForm_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.L && (e.Control))
        {
            MessageBox.Show("You can choose from four different languages by clicking on the radio buttons");
        }
        else if (e.KeyCode == Keys.A && (e.Shift))
        {
            MessageBox.Show("This is version 1.0");
        }
    }
}

如果您想在表单或控件中捕获命令键,您必须重写 ProcessCmdKey 方法。在您的表单中使用此代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Shift | Keys.A))
        {

        }
        else if (keyData == (Keys.Control | Keys.I))
        {

        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

在这里您可以找到更多关于 processing command keys 的信息。