获取所有按下的键

时间:2012-05-07 14:45:01

标签: c# keypress keydown

我必须使用什么才能获得此刻在键盘上按下的“所有按键”?因为Form.KeyPress += new EventHandler()在填充控件时根本不起作用。无论我做什么,它都不会调用它,KeyDown,KeyUp或其他任何东西......是的,我知道如何使用它们。

所以,如果系统中有任何可以检查按键的函数,那么它会返回一个使用过的键的数组或者其他东西 - 我会很高兴能指向正确的方向。

4 个答案:

答案 0 :(得分:13)

听起来您想要查询键盘中所有键的状态。最好的功能是Win32 API调用GetKeyboardState

我不相信有一个很好的托管等效的功能。它的PInvoke代码非常简单

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetKeyboardState(byte [] lpKeyState);

var array = new byte[256];
GetKeyboardState(array);

这将使用系统中每个虚拟键的up / down状态填充byte[]。如果设置了高位,则当前按下虚拟键。只需考虑数字Key值的byte部分,即可将Key映射到虚拟键代码。

public static byte GetVirtualKeyCode(Key key) {
  int value = (int)key;
  return (byte)(value & 0xFF);
}

以上适用于大多数Key值,但您需要注意修饰键。值Keys.AltKeys.ControlKeys.Shift在这里不起作用,因为它们是技术上的修饰符,而不是键值。要使用修饰符,您需要使用实际关联的键值Keys.ControlKeyKeys.LShiftKey等...(实际上任何以Key结尾的内容)

因此,检查是否设置了特定键可以按如下方式完成

var code = GetVirtualKeyCode(Key.A);
if ((array[code] & 0x80) != 0) {
  // It's pressed
} else { 
  // It's not pressed
}

答案 1 :(得分:3)

我对JaredPar的答案进行了一些扩展。以下方法返回当前正在按下的所有键的集合:

Content-Type

答案 2 :(得分:1)

如果您只需知道应用程序处于活动状态时的所有击键,无论您的应用程序中的哪个控件都有焦点,都可以使用表单的KeyPreview属性。

只需将该属性设置为true,即可在表单<订单上订阅所需的键事件。现在,在将应用程序转发到具体控件之前,您将收到应用程序中的所有击键,允许您对自己做出反应,并取消将其转发给控件,将Cancel属性设置为true。

如果您需要在应用程序不是活动状态时接收按键,则需要某种低级键盘挂钩。我没有对它进行测试,但this article on CodeProject对于这种情况看起来很有希望。

答案 3 :(得分:0)

我相信您正在寻找PreviewKeyDown事件,如果在表单具有焦点时按下某个键,则会触发该事件,即使该表单中的另一个子控件当前具有焦点。