2016-04-28 36 views
1

有没有办法让两个keydowns同时工作,所以它们不会互相阻塞?Visual Studio C#Keydown互相阻塞

private void multiplayer_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Up) 
     { 
      //do stuff 
     } 

     if (e.KeyCode == Keys.Down) 
     { 
      //do stuff 
     } 
    } 
+0

只有一个UI线程。排队你工作发生在后台线程,你应该去。 –

+0

谢谢,我会尽力 – Jerka

回答

2

您可能会遇到密钥重复问题。如果是这种情况,则按下时只会触发最后一个按键。你需要做的是用KeyDown,KeyUp和Deactivate来控制状态,并且有一个定时器来完成实际的工作。定时器将控制你的“游戏循环”运行的速度...对于我的示例,我启用了定时器并将间隔设置为10.

public partial class Form1 : Form 
{ 
    private bool _k1 = false; 
    private bool _k2 = false; 

    private bool _d1 = false; 
    private bool _d2 = false; 

    private int _u1 = 0; 
    private int _u2 = 0; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.KeyCode) 
     { 
      case Keys.Up: 
       _k1 = true; 
       _d1= true; 
       break; 
      case Keys.Down: 
       _k1 = true; 
       _d1 = false; 
       break; 

      case Keys.W: 
       _k2 = true; 
       _d2 = true; 
       break; 
      case Keys.S: 
       _k2 = true; 
       _d2 = false; 
       break; 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (_k1) 
      label1.Text =(_u1 = _u1 + (_d1 ? 1 : -1)).ToString(); 
     if (_k2) 
      label2.Text = (_u2 = _u2 + (_d2 ? 1 : -1)).ToString(); 
    } 

    private void Form1_KeyUp(object sender, KeyEventArgs e) 
    { 
     switch (e.KeyCode) 
     { 
      case Keys.Up: 
       _k1 = false; 
       _d1 = true; 
       break; 
      case Keys.Down: 
       _k1 = false; 
       _d1 = false; 
       break; 

      case Keys.W: 
       _k2 = false; 
       _d2 = true; 
       break; 
      case Keys.S: 
       _k2 = false; 
       _d2 = false; 
       break; 
     } 
    } 

    private void Form1_Deactivate(object sender, EventArgs e) 
    { 
     _k1 = false; 
     _k2 = false; 
    } 
} 
0

您可以通过此处理一些按键组合:

if (e.Control && e.KeyCode == Keys.K) { 
    //Your code here 
} 

但是,它需要使用压一些特殊的功能键(比如,Alt',控制, Shift`等)。

+0

好的,谢谢你的回答,但我认为这不会在这种情况下工作。它应该控制两个不同的“玩家”,在同一个键盘上玩。你有其他建议吗? – Jerka

+0

如果你需要处理由不同'玩家'制作的两个不同的新闻,那么每个玩家应该平行处理它(如通过事件队列) – MaKCbIMKo

+0

好吧你如何让他们处理paralllel?我在编码方面很新颖:) – Jerka

0

使用ThreadPool.QueueUserWorkItem做非阻塞工作,但如果您尝试从工作线程更新您的用户界面,需要小心。如果您使用WinForms,则可能还需要查看Control.Invoke