Visual Studio C # KeyDown блокирует друг друга -- c# поле с участием visual-studio пол Связанный проблема

Visual Studio C# Keydown blocking each other


1
vote

проблема

русский

Есть ли способ сделать два ключа работать одновременно, поэтому они не блокируют друг друга?

 <код>     private void multiplayer_KeyDown(object sender, KeyEventArgs e)     {         if (e.KeyCode == Keys.Up)         {             //do stuff         }          if (e.KeyCode == Keys.Down)         {             //do stuff         }     }   
Английский оригинал

Is there a way to make two keydowns working at the same time, so they don't block each other?

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

Список ответов

2
 
vote
vote
Лучший ответ
 

Вы можете работать в проблему с ключом повторить. Если это то, что вниз будет только пожар для последнего нажатия нажатия. То, что вам нужно сделать вместо этого, это управлять состоянием с помощью KeyDown, keyup и deacaTivate, а также иметь таймер, который будет выполнять фактическую работу. Таймер будет управлять тем, как быстро работает ваш «игровой петли» ... Для моего примера я просто включил таймер и установить интервал на 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;     } }   
 

You may be running into an issue with key repeat. If that is the case the down will only fire for the last key pressed. What you need to do instead is control the state with KeyDown, KeyUp, and Deactivate as well as have a timer which will do the actual work. The timer will control how fast your "game loop" runs... for my example I just enabled the timer and set the interval to 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;     } } 
</div
 
 
0
 
vote

Вы можете справиться с некоторыми клавичными комбинациями прессы этой:

 <код> if (e.Control && e.KeyCode == Keys.K) {     //Your code here }   

Но это требует использования нажатых специальных ключей (например, <код> Alt', Control <Код> , Shift` и т. Д.).

 

You can handle some key press combinations by this:

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

But it requires to use some special keys pressed (like, Alt',Control,Shift` etc).

</div
 
 
       
       
0
 
vote

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

 

Use ThreadPool.QueueUserWorkItem to do non-blocking work but care needs to be taken if you try to update your UI from your worker threads. You might also need to look into Control.Invoke if you are using WinForms.

</div
 
 

Связанный проблема

2  Несколько клиентских проектов на один серверный проект W / Silverlight & Ria Services Beta  ( Multiple client projects to one server project w silverlight ria services bet ) 
Тип или имя пространства имен «Ресурсы» не существует в «MyWebProject.Web» (Вы пропустите сборку Ссылка?) C: users ... mysecondproject generated_...

0  Соединение не было закрыто. Текущее состояние соединения открыто  ( Connection was not closed connections current state is open ) 
Это дает сообщение об ошибках не было закрыто. Текущее состояние соединения открыто. Пожалуйста, помогите с кодом. <код> private void comboBox1_SelectedIn...

3  C # PropertiveGrid Drag Drop  ( C sharp propertygrid drag drop ) 
Я пытаюсь реализовать поддержку перетаскивания / падения на свойств в C # с использованием VS2005 (.NET 2.0). Собственность могут обрабатывать драгерацию и т....

0  Тест подразделения для класса банка в C #  ( Unit test for bank class in c sharp ) 
Я учусь создавать модульные тесты для проекта, написанного в C #. Я был следовать примеру на веб-сайте MSDN, и теперь я только что застрял на том, как создать...

5  сериализовать два разных экземпляра в списке на одну строку JSON  ( Serialize two different instances in a list to a single json string ) 
У меня есть два типа классов: <код> public class HolidayClass { public int ID { get; set; } public string Name { get; set; } public DateTime Sta...

0  Не читайте текстовые данные на таблицу SQL в C #  ( Not reading text data to sql table in c sharp ) 
Поэтому я следовал большему количеству помощи, которую я мог найти здесь. Я создал программу C #, которая читает из текстового файла и вставляет в таблицу баз...

0  Сообщение об ошибке Wile пытается открыть файл .xls  ( Error message wile trying to open xls file ) 
Я создаю файл Excel на лету для отправки его вложение в электронном письме. Соответствующий фрагмент кода приведен ниже (это консольное приложение) <код> pu...

0  Анимация спрайты в XNE после мыши  ( Sprite animation in xna following the mouse ) 
Моя старая проблема заключалась в том, что мой код изначально следит за мышью, но когда она достигла мыши, она исчезла, и в конечном итоге исчезла. Моя теку...

0  Создание ссылки IPC между плагинами APC Java и C #  ( Establishing ipc link between a java app and c based plugins ) 
У нас есть приложение Java, а также ряд плагинов C #, для других приложений (например, Excel), которые могут взаимодействовать с основным приложением. Слой св...

0  Как загрузить каталог на FTP, используя ftplib?  ( How to upload directory to ftp using ftplib ) 
У меня проблемы с загрузкой Все файлы на FTP: я использую ftplib . У меня есть функция для загрузки: <код> Proj executable not found. Please set PROJ_DIR v...

4  Трудно запустить параллельные вставки на SQLite базу данных в C #  ( Difficulty running concurrent inserts on sqlite database in c sharp ) 
Я запускаю ряд потоков, которые каждая попытка выполнить вставки в одну базу данных SQLite. Каждый поток создает собственную связь с БД. Каждый из них создает...

1  Получение строки сразу после вставки возвращается нет результата  ( Getting row right after insert returns no result ) 
Я бегут тесты подразделения, и когда я пытаюсь вставить данные в базу данных и получить его сразу после того, как я ничего не получаю (я пробовал с <код> Data...

5  Использование Litjson в Unity3D  ( Using litjson in unity3d ) 
2 вопроса. 1) Можно ли использовать библиотеку Litjson AS так же, как и сценарии в JavaScript? Это действительно общий вопрос о том, чтобы иметь возможность...

1  Получение релевантности упорядоченный результат из текстового запроса на коллекции MongoDB с использованием драйвера C #  ( Retrieve relevance ordered result from text query on mongodb collection using th ) 
Я пытаюсь отправить текстовые запросы коллекции и получить результаты в текстовом порядке. документы объяснить довольно хорошо, как это сделать в оболочке: ...

0  1002 Ошибка API Вызов PayPal Sandbox  ( 1002 error api call paypal sandbox ) 
Я создал учетную запись PayPal Sandbox, и создал пользователь, и у меня есть все учетные данные, осмотр этого правильных учетных данных, которые он несколько ...

Связанный проблема

2  Несколько клиентских проектов на один серверный проект W / Silverlight & Ria Services Beta 
0  Соединение не было закрыто. Текущее состояние соединения открыто 
3  C # PropertiveGrid Drag Drop 
0  Тест подразделения для класса банка в C # 
5  сериализовать два разных экземпляра в списке на одну строку JSON 
0  Не читайте текстовые данные на таблицу SQL в C # 
0  Сообщение об ошибке Wile пытается открыть файл .xls 
0  Анимация спрайты в XNE после мыши 
0  Создание ссылки IPC между плагинами APC Java и C # 
0  Как загрузить каталог на FTP, используя ftplib? 
4  Трудно запустить параллельные вставки на SQLite базу данных в C # 
1  Получение строки сразу после вставки возвращается нет результата 
5  Использование Litjson в Unity3D 
1  Получение релевантности упорядоченный результат из текстового запроса на коллекции MongoDB с использованием драйвера C # 
0  1002 Ошибка API Вызов PayPal Sandbox