键盘处理程序

时间:2015-12-03 17:00:13

标签: c# user-interface events handler calculator

我从C#开始,我正在做一个计算器作为我的第一个项目。我想为我的GUI使用键盘处理程序,它与我之前使用的按钮处理程序进行相同的操作。问题是当我进入“输入”键时。那是我的无效:

private void keyboardHandler(object sender, KeyPressEventArgs e){
  char keyPressed = e.KeyChar;
  if (keyPressed >= (char)Keys.D0 && keyPressed <= (char)Keys.D9)
  {
    //Some stuff
  }
  else if (keyPressed == (char)Keys.Back)
  {
    //More stuff
  }
  else if (keyPressed == (char)Keys.Enter || keyPressed == (char)Keys.Return)
  {
    this.operate();
    operator = operation.START;
  }
} 

问题是,如果我按下回车键,它会抛出处理程序事件但它也按下按钮,就像我点击它一样。这是一张图片:

enter image description here

有什么想法吗?谢谢:))

2 个答案:

答案 0 :(得分:3)

覆盖表单的ProcessCmdKey处理程序。

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            this.operate();
            operator = operation.START;
            return true;
        }

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

答案 1 :(得分:2)

您需要将KeyPressEventArgs.Handled属性设置为true

因此,这告诉操作系统或普通窗口消息传递函数(WndProc)忽略按键,因为它已经处于危险状态。请参阅:https://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.handled%28v=vs.110%29.aspx

所以喜欢:

private void keyboardHandler(object sender, KeyPressEventArgs e){
  char keyPressed = e.KeyChar;
  if (keyPressed >= (char)Keys.D0 && keyPressed <= (char)Keys.D9)
  {
    //Some stuff
  }
  else if (keyPressed == (char)Keys.Back)
  {
    //More stuff
  }
  else if (keyPressed == (char)Keys.Enter || keyPressed == (char)Keys.Return)
  {
    this.operate();
    operator = operation.START;
    e.Handled = true;
  }
}