【问题标题】:c# need if statement to check for space and arrow keys pressedc#需要if语句来检查空格和箭头键是否按下
【发布时间】:2014-04-03 20:35:06
【问题描述】:
if (e.KeyCode == Keys.Space && e.KeyCode == Keys.Right)
{
    //do stuff 
}

基本上它不会同时读取空格键和向右箭头键。

【问题讨论】:

  • 问自己一个问题,一个值怎么可能是 1 和 2?
  • 您可以使用此处概述的方法捕获多个按键:[在此处输入链接描述][1] [1]:stackoverflow.com/questions/709540/…

标签: c#


【解决方案1】:

您需要了解生成的代码是否包含您需要的所有键(因为它是同时按下多个键的聚合结果)

所以你可能会喜欢:

if((e.KeyCode | Keys.Space == e.KeyCode) && 
      (e.KeyCode | Keys.Right== e.KeyCode)) //BINARY OR EXECUTION 

x  y  result
------------
1  1     1
1  0     1 //CHANGED !=x
0  1     1 //CHANGED !=x
0  0     

基本思想是:如果我对其中的另一个数字执行 binary OR,结果必须与原始数字相同。

【讨论】:

    【解决方案2】:

    标准的 .Net 框架不允许您直接检查是否按下了多个键(Ctrl、Shift 和 Alt 等修饰键除外)。

    至少有三种可能的解决方案:

    1. 维护您自己感兴趣的键的状态数组,并更新每个 KeyDown 和 KeyUp 事件的状态。然后您将知道在任何 KeyDown 事件发生时哪些键处于关闭状态。

    2. 在您的 KeyDown 处理程序 use P/Invoke to call the Windows API GetKeyboardState() function 中检查您感兴趣的所有键的状态。

    3. 在您的 KeyDown 处理程序 use P/Invoke to call the Windows API GetKeyState() function 中确定您感兴趣的每个键的键状态。

    也许拨打GetKeyboardState() 会最方便。

    例如,要声明 P/Invoke:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetKeyboardState(byte[] lpKeyState);
    

    您的 KeyDown 处理程序内部执行以下操作:

    byte[] keys = new byte[255];
    GetKeyboardState(keys);
    
    // keys[x] will be 129 if the key defined by x is down.
    
    if ((keys[(int)Keys.Space] == 129) && (keys[(int)Keys.Right] == 129))
        ... Space and Right are both pressed
    

    请阅读the comments on PInvoke.Net 了解警告和进一步建议。

    【讨论】:

      【解决方案3】:

      你必须这样做

      if((e.KeyCode | Keys.Space == e.KeyCode) && (e.KeyCode | Keys.Right== e.KeyCode))
      

      【讨论】:

      • 这没什么好解释的。
      猜你喜欢
      • 2022-07-26
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多