如何检测是否在 C# 窗体中按下多个键

How to detect if multiple keys are pressed in C# forms

我一直在寻找一种解决方案来检测是否在 C# 中按下了多个键(我找不到解决方案!)。 我有两个玩家玩这个游戏,我需要检测是否按下了一个键来移动他们。 (我正在使用 C# 表单) 我只找到了检测是否同时按下两个键的答案,但没有帮助。

--编辑--

如何使用 KeyPressed (C#) 检测某个键是否被按下

您可以使用程序级键盘钩子来实现它。您可以使用 Win-API 函数,例如 user32.dll 中的 SetWindowsHookEx

这里有一些例子:

A Simple C# Global Keyboard Hook
Global keyboard capture in C# application

问题的根源是Winforms根本不支持这个简单的请求。

听起来很奇怪?这是。 Winforms 通常非常接近硬件层,虽然有时这可能很有趣,但它也可能只是一个皮塔饼..

((应注意 Hans 的一个隐藏提示:在 KeyUp 中,您会被告知释放了哪个键,因此您可以根据需要跟踪任意数量的键。))

但现在是一个直接的解决方案,不需要您保留一堆 bools 并在 KeyDown KeyUp 事件..: 输入 Keyboard.IsKeyDown.

有了它,这样的代码就可以工作了:

Uses the Keyboard.IsKeyDown to determine if a key is down. e is an instance of KeyEventArgs.

if (Keyboard.IsKeyDown(Key.Return)) {
    btnIsDown.Background = Brushes.Red; }
...

当然你也可以检查多个密钥:

if (Keyboard.IsKeyDown(Key.A) && Keyboard.IsKeyDown(Key.W)) ...

唯一的要求是你从WPF那里借来的:

首先:添加命名空间:

using System.Windows.Input;

然后:添加两个对项目的引用:

PresentationCore
WindowsBase

现在您可以随时测试键盘,包括 KeyPress 事件..

可能用于打印到控制台...

if (Input.GetKeyDown(KeyCode.G))     {print ("G key pressed");}

最简单的方法是:

  1. 为表单创建一个 KeyDown 事件

  2. 在class中写下下面的DllImports:

    [DllImport("user32")]
        public static extern int GetAsyncKeyState(int vKey);
    
    [DllImport("user32.dll")]
        public static extern int GetKeyboardState(byte[] keystate); 
    
    
  3. 在 KeyDown 事件中写下以下代码:

            byte[] keys = new byte[256];
    
            GetKeyboardState(keys);
    
            if ((keys[(int)Keys.ControlKey] & keys[(int)Keys.S] & 128) == 128) // change the keys if you want to
            {
                // it worked
            }
    
    
  4. 将代码 this.KeyPreview = true; 粘贴到 Form_Load 活动中,开始吧。

这是目前处理多个按键事件的最佳方式,因为它是 WinForms 的一种简单直接的方式。