在Windows窗体表单中工作时,如何在C#中捕获多个键?
我似乎无法同时获得向上箭头和向右箭头.
我认为当你使用GetKeyboardState API函数时,你会感觉最好.
[DllImport ("user32.dll")] public static extern int GetKeyboardState( byte[] keystate ); private void Form1_KeyDown(object sender, KeyEventArgs e) { byte[] keys = new byte[256]; GetKeyboardState (keys); if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128 ) == 128) { Console.WriteLine ("Up Arrow key and Right Arrow key down."); } }
在KeyDown事件中,您只需要询问键盘的"状态".GetKeyboardState将填充您提供的字节数组,此数组中的每个元素都表示键的状态.
您可以使用每个虚拟键代码的数值访问每个键状态.当该键的字节设置为129或128时,表示该键已关闭(按下).如果该键的值为1或0,则键处于启动状态(未按下).值1用于切换键状态(例如,大写锁定状态).
有关详细信息,请参阅GetKeyboardState的Microsoft文档.
一个小概念验证代码,假设Form1
包含label1
:
private ListpressedKeys = new List (); private void Form1_KeyDown(object sender, KeyEventArgs e) { pressedKeys.Add(e.KeyCode); printPressedKeys(); } private void Form1_KeyUp(object sender, KeyEventArgs e) { pressedKeys.Remove(e.KeyCode); printPressedKeys(); } private void printPressedKeys() { label1.Text = string.Empty; foreach (var key in pressedKeys) { label1.Text += key.ToString() + Environment.NewLine; } }