首页 新闻 会员 周边

c#中如何实现处理同一时间按下两个键

-1
[已解决问题] 解决于 2010-11-18 20:05

比如说,同时按下a键和b键后,程序才做出相关的响应

fishall的主页 fishall | 菜鸟二级 | 园豆:300
提问于:2010-11-03 21:07
< >
分享
最佳答案
0

首先要在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钩子技术,即使程序没有获取焦点的时候也可以监控键盘消息,那个你就自己慢慢研究吧

dodohua | 小虾三级 |园豆:1037 | 2010-11-04 10:54
其他回答(2)
0

void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.IsKeyDown(Key.A) && Keyboard.IsKeyDown(Key.C))
MessageBox.Show(
"Ok");
}

 

carlWolf | 园豆:295 (菜鸟二级) | 2010-11-03 23:36
0

先在KeyDown事件中收集按下的键  然后依次处理  在KeyUp事件中删除收集到的键

周见智 | 园豆:156 (初学一级) | 2012-06-24 16:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册