if (e.KeyCode == Keys.Space && e.KeyCode == Keys.Right)
{
//do stuff
}
基本上它不是同时按下空格键和右箭头键。
答案 0 :(得分:3)
您需要了解结果代码是否包含您需要的所有密钥(因为它是在同一时刻按下多个密钥的聚合结果)
所以你可以这样做:
if((e.KeyCode | Keys.Space == e.KeyCode) &&
(e.KeyCode | Keys.Right== e.KeyCode)) //BINARY OR EXECUTION
OR
x y result
------------
1 1 1
1 0 1 //CHANGED !=x
0 1 1 //CHANGED !=x
0 0
基本思路是:如果我对其中的另一个号码执行二进制OR ,则结果必须与原始号码相同。
答案 1 :(得分:1)
标准.Net框架不允许您直接检查是否按下了多个键(除了修改键,如Ctrl,Shift和Alt)。
至少有三种可能的解决方案:
维护您感兴趣的键的自己的状态数组,并更新每个KeyDown和KeyUp事件的状态。然后,您将知道任何KeyDown事件时哪些键已关闭。
在您的KeyDown处理程序use P/Invoke to call the Windows API GetKeyboardState()
function中检查您感兴趣的所有密钥的状态。
在您的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以获取警告和进一步的建议。
答案 2 :(得分:0)
你必须这样做
if((e.KeyCode | Keys.Space == e.KeyCode) && (e.KeyCode | Keys.Right== e.KeyCode))