【问题标题】:How do I read keyboard input on a Winform?如何在 Winform 上读取键盘输入?
【发布时间】:2011-09-23 09:38:14
【问题描述】:

我已经尝试使用 KeyUp 和 KeyDown 事件来读取键盘输入,但是一旦我在 Winform 上放置其他控件,键就不会被读取。如何确保读取密钥?

【问题讨论】:

  • 您的意思是它适用于空白表单,如果有控件则不起作用?
  • 是的,正如在下面的答案中所写,它适用于按钮、文本框等控件,但是当我放置用户控件时它停止工作。
  • 它不应该工作,键盘输入转到具有焦点的控件。你真正想做什么?
  • 我正在尝试从键盘读取输入并将其可视化在用户控件上。

标签: c# winforms keyboard


【解决方案1】:

如果您正在寻找您的表单本身来读取键盘输入,那么您已经从其他通讯员那里得到了答案。我添加此贡献是因为您可能希望将键处理添加到表单上的其他控件或用户控件。我在 DevX.com 上发表的文章 Exploring Secrets of .NET Keystroke Handling (唉,它确实需要注册,但它是免费的)为您提供了关于所有各种键处理挂钩和事件如何以及为什么发挥作用的全面讨论。此外,该文章还包括一个“击键沙盒”实用程序,可免费下载,实际上可以让您查看哪些控件正在接收哪些键处理事件。

这是文章中的一个插图,可以激发您的食欲:

【讨论】:

    【解决方案2】:

    见:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

    设置KeyPreview = true,您的KeyUpKeyDown 将识别所有键盘输入。

    【讨论】:

      【解决方案3】:

      正如 marco 所说,在表单上将 KeyPreview 设置为 true 以捕获整个表单中的关键事件,而不仅仅是一个控件。

      使用 KeyPress 事件 ... KeyUp/Down 比您的代码更适用于框架。如果您想禁用某个键...只有数字字段等,KeyDown 是很好的选择。通常 KeyPress 是您所追求的。

      如果您想防止击键传播到其他控件,请设置 KeyPressEventArgs.Handled = true。

      http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx

      您是否连接了事件处理程序?

      MyForm.KeyDown += MyHandler;
      

      您也可以在属性窗格中执行此操作...单击事件图标...

      【讨论】:

      • 我需要上下。我想可视化被按下的键,所以 keyUp 和 keyDown 都需要发生一些事情。
      • 啊,我明白了... KeyUp/Down 应该可以正常工作。您是否连接了事件处理程序?在事件部分的属性窗格中还是在代码中? MyForm.KeyDown += MyEventHandler;
      • 是的,我已经连接了事件处理程序。它可以工作,但如果我在表单上放置一个用户控件,它就会停止工作。
      • @iDevForFun:我尝试设置e.Handled = true,但密钥被传播。我必须设置e.SuppressKeyPress = true(看看我的帖子)。你认为正确吗?
      • 如果 KeyPreview 未设置为 true,您只能处理具有焦点的控件的按键事件。我只能猜测您的用户控件正在集中注意力并阻止传播关键事件。您是否将 KeyPreview 设置为 true?
      【解决方案4】:

      您可以在表单上设置KeyPreview = true 来捕捉键盘事件。

      EDITED让你明白:

      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
          if (e.KeyCode == Keys.A) 
              e.SuppressKeyPress = true;
      }
      

      接收键盘事件并在按下 A 时丢弃的愚蠢示例。
      如果焦点在文本框中,您会看到已写入文本,但不是 A!!

      再次编辑:我从一个 VB.NET 示例中获取了这段代码。
      在您的用户控件中,使用文本框的“按键”事件引发“用户控件事件”。
      此代码将在您的自定义用户控件中:

      'Declare the event
      Event KeyPress(KeyAscii As Integer) 
      
      Private Sub Text1_KeyPress(KeyAscii As Integer)
          RaiseEvent KeyPress(KeyAscii)
      End Sub
      

      【讨论】:

      • @Bildsoe:我试过了,效果很好。您应该在表单上捕获KeyDownKeyUp 事件:您一定会得到它们。如果不发布您的代码,请因为应该有问题......
      • 好的,谢谢,我试试,我一定是做错了什么。我的表单上有一个用户控件,这会改变什么吗?
      • @Bildsoe:不,它不会改变任何东西。使用KeyPreview = true 键盘事件在控件之前发送到表单...
      • 我尝试删除用户控件,然后它工作。此外,如果我有文本框、按钮等。但没有用户控件。这是为什么呢?
      • 我看过这个例子,但我知道如何使用它。我在文本框上连接了一个事件,该事件在包含表单上引发了一个事件?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多