【问题标题】:How do I get characters from KeyEventArgs and not KeyPressEventArgs?如何从 KeyEventArgs 而不是 KeyPressEventArgs 中获取字符?
【发布时间】:2013-03-05 21:05:50
【问题描述】:

我知道这个问题已被问过数百次,但我一直无法找到对我有帮助的解决方案。我正在使用条形码扫描仪,我希望能够获取仅使用 keydown 事件键入的键。出于某种原因,我不能同时使用 keydown 和 keypress 事件(我的 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;
}

【问题讨论】:

  • 到目前为止您尝试过什么?你有什么代码来证明你的工作?你看过KeyEventArgs类了吗?
  • 显示当前的 KeyPress 事件肯定会有所帮助,我们需要查看您是否正确检查了键的字符并检查以确保两台机器上的区域设置设置相同/环境
  • 您是否尝试在单击光标键后对其进行检测?你到底想完成什么-
  • 我正在尝试存储字符但也检测回车键。
  • 这里的这行if (e.KeyData == Keys.Enter)不应该是if (e.KeyData == Key.Enter)吗?我也认为应该是if(e.key ==Key.Enter)

标签: c# keypress keydown


【解决方案1】:

您上面的代码工作...在一个空白表格上。但是,有几件事会干扰关键事件,尤其是当页面上有其他控件时。确保

  • AcceptButton 属性未在表单上设置(这将捕获 Enter 键)
  • TabStop 设置为 true 的表单上没有控件(可能不可行,但试一试)
  • 在您输入时表单具有焦点(不太可能给出说明,但还是要检查)
  • 键入时,焦点不在表单中的任何控件上,例如,TextBox
  • 没有其他控件正在尝试处理 KeyPressKeyDown 事件,并且在您的代码中的其他任何地方都没有配置/设置其他自定义事件

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

form.KeyDown += new KeyEventHandler(Input_KeyDown);

这意味着您正在从另一个地方实例化此表单并试图让它将其关键事件发送到调用代码。您确定 form 实例被持久化/保存到私有类级别变量或类似的变量吗?

【讨论】:

  • 在我看到你的帖子之前我就知道了,但你是正确的。我制作了一个文本框,看起来好像没有获得焦点,但实际上是在窃取它,所以它占用了我的按键(但不是我的按键……为什么?)不过,很好的答案。
猜你喜欢
  • 2011-06-30
  • 2017-10-02
  • 1970-01-01
  • 2023-02-10
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多