首先要在Form1_Load函数里面把this.KeyPreview的属性设为true,然后就可以调用from事件:两个公共函数: bool isKeyDownA = false;
bool isKeyDownB = false;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
string a = e.KeyCode.ToString();
string b = e.KeyData.ToString();
string c = e.KeyValue.ToString();
if (e.KeyCode.ToString().ToLower() == "a")
{
isKeyDownA = true;
}
if (e.KeyCode.ToString().ToLower() == "b")
{
isKeyDownB = true;
}
if (isKeyDownA && isKeyDownB)
MessageBox.Show("test");
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString().ToLower() == "a")
{
isKeyDownA = false;
}
if (e.KeyCode.ToString().ToLower() == "b")
{
isKeyDownB = false;
}
}
但是,问题出现了,用这种办法的话,当message弹出框的时候,form1焦点丢失了,所以就不会执行keyup事件,然后就出现怪事,无论按a还是按b都会弹出框,但是有办法地,代码如下:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
string a = e.KeyCode.ToString();
string b = e.KeyData.ToString();
string c = e.KeyValue.ToString();
if (e.KeyCode.ToString().ToLower() == "a")
{
isKeyDownA = true;
}
if (e.KeyCode.ToString().ToLower() == "b")
{
isKeyDownB = true;
}
if (isKeyDownA && isKeyDownB)
{
MessageBox.Show("test");
//增加下面代码就能解决,重新初始化
isKeyDownA = false;
isKeyDownB = false;
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode.ToString().ToLower() == "a")
{
isKeyDownA = false;
}
if (e.KeyCode.ToString().ToLower() == "b")
{
isKeyDownB = false;
}
}
当然,你可以直接用hook钩子技术,即使程序没有获取焦点的时候也可以监控键盘消息,那个你就自己慢慢研究吧
void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.IsKeyDown(Key.A) && Keyboard.IsKeyDown(Key.C))
MessageBox.Show("Ok");
}
先在KeyDown事件中收集按下的键 然后依次处理 在KeyUp事件中删除收集到的键