2016-04-28 72 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