【问题标题】:Windows Forms .NET : How to detect more than 2 keys downWindows Forms .NET:如何检测超过 2 个按键
【发布时间】:2017-08-31 15:17:34
【问题描述】:

想知道您是否可以检测到 Windows 窗体中是否同时按下了“A”、“C”和退格键。到目前为止,我所看到的是如何在堆栈交换中检查诸如“Ctrl”+“T”之类的东西,这是特定于按下“控制键”的。

一般来说,我正在寻找一种方法来检查键盘上的任何 3 个键是否同时按下。这可能是 Ctrl+Alt+Del,甚至是 W+A+S+D 或 Up+Home+Insert。

【问题讨论】:

  • 使用 KeyDown 事件并检查是否按下了其他键。 Winforms 缺少一种使这变得容易的方法,但这可以easily be added。你不能用 Ctrl+Alt+Del 做任何事情,它很特别。如果你想做 WASD,那么你总是会考虑简单地使用 KeyDown 和 KeyUp 事件来设置游戏循环的方向变量。

标签: winforms windows-forms-designer


【解决方案1】:

这将创建一个字典来处理它。通过基本测试,它似乎运行良好。

Dictionary<Keys, bool> keysDict;
public Form1()
{
    InitializeComponent();
    keysDict = new Dictionary<Keys, bool>();
    this.KeyDown += Form1_KeyDown;
    this.KeyUp += Form1_KeyUp;
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (keysDict.ContainsKey(e.KeyCode))
    {
        keysDict[e.KeyCode] = false;
    }
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (!keysDict.ContainsKey(e.KeyCode))
    {
        keysDict.Add(e.KeyCode, true);
    }
    else
    {
        keysDict[e.KeyCode] = true;
    }
    if (keysDict.ContainsKey(Keys.A) && keysDict[Keys.A] && keysDict.ContainsKey(Keys.W) && keysDict[Keys.W] && keysDict.ContainsKey(Keys.S) && keysDict[Keys.S] && keysDict.ContainsKey(Keys.D) && keysDict[Keys.D])
    {
        Console.WriteLine("WASD Pressed");
    }
}

编辑 如果您想查看字典中有哪些键,只需按下它们,然后添加一个断点来检查它解析为什么。

在您的评论中,您询问了 TAB、ENTER、SHIFT 以及我认为的其他内容。所以举个例子,我按回车、ctrl、shift、alt、tab,然后放一个断点,我得到了:

{[Return, False]}
{[ControlKey, False]}
{[ShiftKey, False]}
{[Menu, False]}
{[Tab, False]}

不用担心它们是假的 - 当您键入时,它不会将它们从字典中删除,它只是将其设置为假,因此您保留它记录的实际键。以上都是keyup,因为我在按下它们之前没有断点,所以当我中断时它们不再被按下。

【讨论】:

  • 用这种方法可以/将要向字典添加哪些键? Hans Passant 的评论让我想知道是否会添加 TAB 或 ENTER 或 CTRL,或者它是否只是字母数字键。
  • 按下任意键。这是一个概念证明——你可以添加逻辑来添加/检查你想要的任何东西。这将保持按下所有键,但这不是一个巨大的内存问题,如果这是你的关注。确保您查看 ControlKey,而不是修饰键。智能感知会告诉你哪个是修饰符,哪个是键。例如,ControlKey 是一个键,Control 是 Control 修饰符……所以,如果键本身不够用,您仍然需要处理修饰符。
  • 只需按下并释放您要查找的键,然后输入断点并检查字典。它会告诉你它包含哪些键。
  • 所以现在我有兴趣检查是否同时按下了键盘上的任何 3 个键,而不是是否按下了特定的 3 个键。有没有办法以有效的方式检查字典中的任何 3 对是否具有“真”值?天真地,我会添加一个遍历字典并检查是否有 3 个值为“真”的 for 循环。如果在程序的每一步都运行,这似乎相当昂贵。
  • 在原始答案中,它说“if (keysDict.ContainsKey(Keys.A) && keysDict[Keys.A] && keysDict.ContainsKey(Keys.W) && keysDict[Keys.W] && keysDict.ContainsKey(Keys.S) && keysDict[Keys.S] && keysDict.ContainsKey(Keys.D) && keysDict[Keys.D]) { Console.WriteLine("WASD Pressed"); }" ...那里.由于它是一个布尔值,因此 keysDict[Keys.A] 只有在被按下时才会为真。如果还没有按下想要的键之一,请首先检查 ContainsKey 以避免错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2013-08-25
  • 2014-07-27
  • 2013-12-14
相关资源
最近更新 更多