繁体   English   中英

如何检测 C# 表单中是否按下了多个键

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

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

- 编辑 -

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

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

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

((应该注意 Hans 的一个隐藏提示:在KeyUp中,您会被告知释放了哪个键,以便您可以跟踪任意数量的键..))

但是现在对于不需要您保留一堆KeyDown bools KeyUp KeyUp中管理它们的直接解决方案..:输入Keyboard.IsKeyDown

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

使用Keyboard.IsKeyDown来确定某个键是否按下。 eKeyEventArgs的一个实例。

 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. 在类中写下下面的 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 事件和繁荣中,你去。

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

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

以下是它的一些例子:

一个简单的 C# 全局键盘钩子
C# 应用程序中的全局键盘捕获

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM