Fre*_*els 15
我认为当你使用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.");
}
}
Run Code Online (Sandbox Code Playgroud)
在KeyDown事件中,您只需要询问键盘的"状态".GetKeyboardState将填充您提供的字节数组,此数组中的每个元素都表示键的状态.
您可以使用每个虚拟键代码的数值访问每个键状态.当该键的字节设置为129或128时,表示该键已关闭(按下).如果该键的值为1或0,则键处于启动状态(未按下).值1用于切换键状态(例如,大写锁定状态).
有关详细信息,请参阅GetKeyboardState的Microsoft文档.
Tor*_*kår 14
一个小概念验证代码,假设Form1包含label1:
private List<Keys> pressedKeys = new List<Keys>();
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;
}
}
Run Code Online (Sandbox Code Playgroud)