2016-04-28 4 views
1

Есть ли способ сделать два нажатия клавиш одновременно, поэтому они не блокируют друг друга?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

Существует только один поток пользовательского интерфейса. в очередь, вы работаете, чтобы произойти в фоновом потоке, и вам нужно идти. –

+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

Хорошо, как вы заставляете их обрабатывать параллель между собой? Я довольно новичок в кодировании :) – Jerka

0

Используйте ThreadPool.QueueUserWorkItem для работы без блокировки, но следует проявлять осторожность, если вы попытаетесь обновить свой пользовательский интерфейс от ваших рабочих потоков. Вам также может понадобиться изучить Control.Invoke, если вы используете WinForms.

Смежные вопросы