如何从KeyEventArgs获取字符而不是KeyPressEventArgs?

时间:2013-03-05 21:05:51

标签: c# keypress keydown

我知道这已被问了好几百次,但我找不到能帮助我的解决方案。我正在使用条形码扫描仪,我希望能够获得仅使用keydown事件键入的键。出于某种原因,我不能同时使用keydown和keypress事件(我的按键事件不会运行)。

我需要能够获取字符,包括连字符,大写字母和点,还需要检测输入键。

这些是我的听众:

form.KeyDown += new KeyEventHandler(Input_KeyDown);
form.KeyPress += new KeyPressEventHandler(Input_KeyPress);

这些是我的方法:

private void TimedOut(object sender, EventArgs e)
{
   _barcode = "";
}

private void Input_KeyDown(object sender, KeyEventArgs e)
{
   _timer.Stop();
   _timer.Start();

   if (e.KeyData == Keys.Enter)
   {
      if (!_barcode.Equals(""))
  {
     this.BarcodeScanned(_barcode, new EventArgs());
  }
   }

   else
   {

   }
}

private void Input_KeyPress(object sender, KeyPressEventArgs e)
{
   _timer.Stop();
   _timer.Start();
   _barcode += e.KeyChar;
}

1 个答案:

答案 0 :(得分:1)

上面的代码在空白表单上有效。但是,有几件事可能会干扰关键事件,尤其是当页面上有其他控件时。确保

  • 表单上未设置AcceptButton属性(这将捕获Enter键)
  • 表单上没有控件TabStop设置为true(可能不行,但可以试一试)
  • 当您输入时表格具有焦点(不太可能给出描述,但无论如何都要检查)
  • 在输入时,表格中的任何控件都不会受到关注,例如TextBox
  • 没有其他控件正在尝试处理KeyPressKeyDown事件,并且代码中的其他位置未配置/设置其他自定义事件

我注意到的一件事是你正在注册这样的事件;

form.KeyDown += new KeyEventHandler(Input_KeyDown);

这意味着您要从另一个地方实例化此表单并尝试将其发送到调用代码。您确定form实例是持久保存/保存到私有类级变量还是某些变量?