我必须使用什么才能获得此刻在键盘上按下的“所有按键”?因为Form.KeyPress += new EventHandler()
在填充控件时根本不起作用。无论我做什么,它都不会调用它,KeyDown,KeyUp或其他任何东西......是的,我知道如何使用它们。
所以,如果系统中有任何可以检查按键的函数,那么它会返回一个使用过的键的数组或者其他东西 - 我会很高兴能指向正确的方向。
答案 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.Alt
,Keys.Control
和Keys.Shift
在这里不起作用,因为它们是技术上的修饰符,而不是键值。要使用修饰符,您需要使用实际关联的键值Keys.ControlKey
,Keys.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事件,如果在表单具有焦点时按下某个键,则会触发该事件,即使该表单中的另一个子控件当前具有焦点。