когда мы нажимаем клавишу и продолжаем нажимать ее, нажатие клавиши и keydown событие непрерывно стреляют. Есть ли способ позволить им стрелять только после полного цикла, например, keydown и затем настроить.
Я хотел бы, чтобы пользователь не смог, нажимают клавишу, непрерывно скорее хотел бы пользователя, должны нажать, затем выпускают клавиатуру для ввода символа!
так, чтобы следование за случаем не происходило, например: pppppppppppppppppppppppp, когда пользователь нажимает 'p' в течение 1 секунды.
Объявить логическое isKeyDown
, в событии KeyDown
установите логическое значение true. В событии KeyUp
установите логическое значение 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 .. ::. Handled Property ... и ... KeyEventArgs .. ::. SuppressKeyPress Property .... для получения соответствующей информации