我如何捕获按键事件?

时间:2015-05-05 22:44:48

标签: c# winforms keypress keyboard-events

当" Ctrl + l "时,我试图显示2个不同的消息框。当" 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");
        }
    }

2 个答案:

答案 0 :(得分:1)

如果要捕获表单或控件中的命令键,则必须覆盖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的更多信息。

答案 1 :(得分:0)

您是否将处理程序(Color_KeyDown)订阅到PreviewKeyDown等事件?我看到你联系了directions_Click来监听你的ToolStripMenuItem上的鼠标点击,这些点击了"方向"控制,但是从你的代码中,我不知道你在哪里听重要事件。

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

myWinFormsControl.PreviewKeyDown += Color_KeyDown;

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

如果您正在使用visual studio,另一个有用的技巧是您可以在设计视图中选择一个控件并打开属性窗格并单击小闪电图标以查看所有该控件的所有可用事件。您还可以在其中一个空卖出中双击以添加新的事件处理程序。 (有关详细信息,请参阅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");
        }
    }
}

并且只是在表单级别捕获(也就是说,只要窗口具有输入焦点):

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");
        }
    }
}