【问题标题】:How to use KeyPressEvent in correct way如何正确使用 KeyPressEvent
【发布时间】:2013-09-29 08:39:54
【问题描述】:

尝试为我的表单创建热键

代码

    private void FormMain_KeyPress(object sender, KeyPressEventArgs e)        
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            MessageBox.Show("e");
        }
    }

适用于一个键,但如果我想使用 CTRL+N 之类的组合键,请尝试使用 if (e.KeyChar == (char)Keys.Enter && e.KeyChar == (char)Keys.N) - 但它不起作用。我是对的 - 使用这样的代码进行组合键?

编辑

此代码仅捕获第一个按下的键,但不捕获组合 - 所以如果我按 CTRL + Enter - 代码捕获 CTRL 但不是 Enter 键 - 尝试创建额外的 if 但 - 结果相同...


将事件从 KeyPress 更改为 KeyDown - 现在可以使用了

【问题讨论】:

    标签: c# .net winforms key


    【解决方案1】:

    对于Control 和另一个字母的其他组合,有一个有趣的事情是,e.KeyChar 会有不同的代码。例如,通常e.KeyChar = 'a' 的代码为97,但在按下a(或A)之前按下Control 时,实际代码为1。所以我们有这段代码来处理其他组合:

    private void FormMain_KeyPress(object sender, KeyPressEventArgs e)        
    {
       //Pressing Control + N
       if(e.KeyChar == 'n'-96) MessageBox.Show("e");
       //Using this way won't help us differentiate the Enter key (10) and the J letter 
    }
    

    您也可以为此目的使用KeyDown 事件。 (其实KeyDown更合适)。因为它支持KeyData,其中包含修饰键和另一个文字键的组合信息:

    private void FormMain_KeyDown(object sender, KeyEventArgs e){
       //Pressing Control + N
       if(e.KeyData == (Keys.Control | Keys.N)) MessageBox.Show("e");
    }
    

    【讨论】:

    • 试试 - modifierKeys - 好的,但不是 N 键得到一些不同的结果 - 请参阅编辑
    【解决方案2】:

    试试这个组合 Ctrl + N,

    if (e.Modifiers == Keys.Control && e.KeyCode == Keys.N)
       {
          MessageBox.Show("e");
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-01
      • 2017-12-31
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多