Intereting Posts
специфические для приложения файлы app.config / web.config в Visual Studio Преобразование пользовательского формата даты (строки) в дату и время Любопытство: почему выражение при компиляции работает быстрее, чем минимальный DynamicMethod? Как сохранить перечисление в базе данных как строку Длительный опрос Остановить другой запрос на 1 или 2 минуты ASP.NET: архитектура разрешения / аутентификации адаптировать class оболочки для двухмерного случая Как отправлять сообщения между c ++ .dll и C # при помощи именованного канала? Событие колеса мыши для работы с зависающим управлением Переменная «MyException» объявлена, но никогда не используется Наблюдает ли Monitor.Wait, что поля перечитываются? Получить последнюю ячейку (столбец, строку) объекта диапазона Excel Не удается загрузить проблему сборки Группировка смежных дат Альтернатива для Obfuscation в мире .NET

как не допускать множественные нажатия клавиш на одно нажатие клавиши?

когда мы нажимаем клавишу и продолжаем нажимать на нее, непрерывно срабатывает событие нажатия и нажатия клавиши. Есть ли способ разрешить этот огонь только после полного цикла, например, с помощью клавиш, а затем с клавиатуры.

Я бы хотел, чтобы пользователь не мог нажимать клавишу непрерывно, а хотелось бы, чтобы пользователь нажал, а затем отпустил клавиатуру, чтобы набрать символ!

так что следующий случай не возникает, например: pppppppppppppppppppppppp, когда пользователь нажимает «p» в течение 1 секунды.

isKeyDown boolean isKeyDown , в событии KeyDown , установите для boolean значение true. В событии KeyUp установите для boolean значение false.

Это пример кода

 bool isKeyDown=false; public void control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if(isKeyDown) return; isKeyDown=true; // do what you want to do } public void control1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { isKeyDown=false; // do you key up event, if any. } 

Вы можете сделать это в масштабе всего приложения, отфильтровывая сообщения с ключом с помощью IMessageFilter. Вот пример:

  public partial class Form1 : Form, IMessageFilter { public Form1() { InitializeComponent(); Application.AddMessageFilter(this); this.FormClosed += (s, e) => Application.RemoveMessageFilter(this); } private Keys mLastKey = Keys.None; public bool PreFilterMessage(ref Message m) { if (m.Msg == 0x100 || m.Msg == 0x104) { // Detect WM_KEYDOWN, WM_SYSKEYDOWN Keys key = (Keys)m.WParam.ToInt32(); if (key != Keys.Control && key != Keys.Shift && key != Keys.Alt) { if (key == mLastKey) return true; mLastKey = key; } } else if (m.Msg == 0x101 || m.Msg == 0x105) { // Detect WM_UP, WM_SYSKEYUP Keys key = (Keys)m.WParam.ToInt32(); if (key == mLastKey) mLastKey = Keys.None; } return false; } } 

Одна вещь, которую я преследовал, – это количество повторений в сообщении WM_KEYDOWN. Как ни странно, это не работало на моей машине, это было 1 для повторения ключей. Не знаю, почему.

Чтобы предотвратить многократное нажатие клавиши при удержании: вы должны использовать свойство SuppressKeyPress следующим образом:

 bool isKeyRepeating = false; public void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (isKeyRepeating) { e.SuppressKeyPress = true; } else { isKeyRepeating = true; } } public void textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { isKeyRepeating = false; } 

См.: KeyEventArgs .. ::. Обработано свойство … и … KeyEventArgs .. ::. SuppressKeyPress Property …. для соответствующей информации