如何检测是否在 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");}
最简单的方法是:
为表单创建一个 KeyDown 事件
在class中写下下面的DllImports:
[DllImport("user32")]
public static extern int GetAsyncKeyState(int vKey);
[DllImport("user32.dll")]
public static extern int GetKeyboardState(byte[] keystate);
在 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
}
将代码 this.KeyPreview = true;
粘贴到 Form_Load 活动中,开始吧。
这是目前处理多个按键事件的最佳方式,因为它是 WinForms 的一种简单直接的方式。
我一直在寻找一种解决方案来检测是否在 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 ofKeyEventArgs
.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");}
最简单的方法是:
为表单创建一个 KeyDown 事件
在class中写下下面的DllImports:
[DllImport("user32")] public static extern int GetAsyncKeyState(int vKey); [DllImport("user32.dll")] public static extern int GetKeyboardState(byte[] keystate);
在 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 }
将代码
this.KeyPreview = true;
粘贴到 Form_Load 活动中,开始吧。
这是目前处理多个按键事件的最佳方式,因为它是 WinForms 的一种简单直接的方式。