【问题标题】:How to detect if multiple keys are pressed in C# forms如何检测 C# 表单中是否按下了多个键
【发布时间】:2016-10-19 06:15:42
【问题描述】:

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

--编辑--

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

【问题讨论】:

  • 这可能有帮助:stackoverflow.com/a/709641/3195195
  • @jeffrycopps 对不起,但这没有帮助,答案只告诉您如何检测是否按下了所有选定的键,而不是是否按下了任何键。
  • 我没有很好地理解你的问题。我猜按下和按住的键是一样的。
  • 水晶球说真正的问题是键重复不再起作用。您应该永远在游戏中依赖的东西,因为重复率和节奏是用户的偏好。没有什么是两个 bool 变量不能做的。使用 KeyDown 事件将它们设置为 true,使用 KeyUp 事件将它们设置回 false。在游戏循环中使用这些布尔值来确定游戏对象应该移动的位置。多个玩家同时按键完全没有关系,您会一个接一个地获得事件。
  • @jeffrycopps 我没有把自己说清楚的技巧,所以这次我会努力让它变得更好。你给我的链接,答案是编码来检查所有的键同时按下,我需要检查是否按下了多个键,例如UP、DOWN、LEFT、RIGHT、W、A、S、D。我不想检查它们是否被同时按下全部

标签: c# forms winforms keyboard key


【解决方案1】:

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

这里有一些例子:

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

【讨论】:

  • 对不起,没用,你能举个例子吗?
【解决方案2】:

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

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

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

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

这样的代码可以工作:

使用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 事件..

【讨论】:

    【解决方案3】:

    也许是为了打印到控制台...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2011-06-22
      • 2012-08-18
      • 2016-10-31
      • 2018-05-02
      • 2014-07-13
      • 2017-05-26
      相关资源
      最近更新 更多