捕获C#中的多个关键点

在Windows窗体表单中工作时,如何在C#中捕获多个关键字?

我似乎无法同时获得向上箭头和向右箭头。

我认为当你使用GetKeyboardState API函数时,你会感觉最好。

[DllImport ("user32.dll")] public static extern int GetKeyboardState( byte[] keystate ); private void Form1_KeyDown(object sender, KeyEventArgs e) { byte[] keys = new byte[256]; GetKeyboardState (keys); if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128 ) == 128) { Console.WriteLine ("Up Arrow key and Right Arrow key down."); } } 

在KeyDown事件中,您只需要询问键盘的“状态”。 GetKeyboardState将填充您提供的字节数组,此数组中的每个元素都表示键的状态。

您可以使用每个虚拟键代码的数值访问每个键状态。 当该键的字节设置为129或128时,表示该键已关闭(按下)。 如果该键的值为1或0,则键处于启动状态(未按下)。 值1用于切换键状态(例如,大写锁定状态)。

有关详细信息,请参阅GetKeyboardState的Microsoft文档 。

假设Form1包含label1 ,为您提供一些概念validation代码:

 private List pressedKeys = new List(); private void Form1_KeyDown(object sender, KeyEventArgs e) { pressedKeys.Add(e.KeyCode); printPressedKeys(); } private void Form1_KeyUp(object sender, KeyEventArgs e) { pressedKeys.Remove(e.KeyCode); printPressedKeys(); } private void printPressedKeys() { label1.Text = string.Empty; foreach (var key in pressedKeys) { label1.Text += key.ToString() + Environment.NewLine; } } 

 Keyboard.IsKeyDown(Key.YourKey) 

你可以处理多个keydowns。

嗯,每个按键都有不同的事件吗?

您可以为每个箭头创建四个布尔值。 按下时,将该箭头的布尔值设置为true。 如果触发释放,则将该箭头的布尔值设置为false。

然后,您可以检查向上和向右布尔值是否为真,然后执行您的操作。

有一个托管库MouseKeyHook作为NuGet ,它为您提供了一个方便的托管包装器。 GitHub上的源代码 。

最近增加了对检测快捷方式,密钥组合和序列的支持。 这是一个处理箭头的用法示例:

 Hook.AppEvents().OnCombination(new Dictionary { {Combination.FromString("Left"), GoWest}, {Combination.FromString("Left+Up"), GoNorthWest}, {Combination.FromString("Up+Left"), GoNorthWest}, {Combination.FromString("Up"), GoNorth}, {Combination.FromString("Up+Right"), GoNorthEast}, {Combination.FromString("Right+Up"), GoNorthEast}, }); 

有关更多信息,请参阅: 检测组合键和序列

使用SPY ++查看如何触发关键时刻。 基本上,如果同时按下多个箭头键,则被击中的第一个键将触发事件,然后当第二个键被击中时,它将开始触发,您将不​​再看到第一个键的事件。 当他们被释放时,你会看到他们的关键事件。 我建议你快速简单地实现之前建议的bool标志。