C# 在C语言中捕获多个按键#

C# 在C语言中捕获多个按键#,c#,winforms,C#,Winforms,在表单中工作时,如何在C#中捕获多个按键 我似乎无法同时获得向上箭头和向右箭头。嗯,每个向下键都有单独的事件吗 可以为每个箭头创建四个布尔值。按下时,将该箭头的布尔值设置为true。如果激发了Release,则将该箭头的布尔值设置为false 然后,您可以检查向上和向右布尔值是否为真,然后执行操作。假设Form1包含label1,为您提供一些概念验证代码: private List<Keys> pressedKeys = new List<Keys>(); privat

在表单中工作时,如何在C#中捕获多个按键


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

嗯,每个向下键都有单独的事件吗

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


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

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

private List<Keys> pressedKeys = new List<Keys>();

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;
    }
}
private List pressedKeys=new List();
私有void Form1\u KeyDown(对象发送方,KeyEventArgs e)
{
按按键。添加(如按键代码);
打印按键();
}
私有void Form1\u KeyUp(对象发送方,KeyEventArgs e)
{
按按键。移除(如按键代码);
打印按键();
}
private void printPressedKeys()
{
label1.Text=string.Empty;
foreach(按下键中的var键)
{
label1.Text+=key.ToString()+Environment.NewLine;
}
}

我认为最好使用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表示切换键状态(例如,caps lock状态)


有关详细信息,请参见。

使用SPY++查看如何触发按键按下。基本上,如果同时按下多个箭头键,第一个被击中的键将触发事件,那么当第二个键被击中时,它将开始触发,并且您将不再看到第一个键的事件。当它们被释放时,您将看到它们的密钥更新事件。我建议您实现前面建议的bool标志,它快速而简单

Keyboard.IsKeyDown(Key.YourKey) 

您可以处理多个键控。

有一个托管库,它为您提供了一个方便的托管包装器

最近增加了对检测快捷方式、组合键和序列的支持。下面是一个处理箭头的使用示例:

Hook.AppEvents().OnCombination(new Dictionary<Combination, Action>
{
    {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},
});
Hook.AppEvents().onComposition(新字典)
{
{composition.FromString(“左”),GoWest},
{composition.FromString(“Left+Up”),GoNorthWest},
{composition.FromString(“向上+向左”),GoNorthWest},
{composition.FromString(“Up”),GoNorth},
{composition.FromString(“向上+向右”),GoNorthEast},
{composition.FromString(“Right+Up”),GoNorthEast},
});

有关更多信息,请参阅:

Hi,您能否详细说明库键盘的来源?System.Windows.Input.Keyboard非常适合WPF。(就汇编而言,它来自PresentationCore.dll)使用@jamesbarras方法,您可以使用Ctrl+字母X+字母Y: