как не позволить несколько keystokes, полученные при одном нажатии клавиши?

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

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

так, чтобы следование за случаем не происходило, например: pppppppppppppppppppppppp, когда пользователь нажимает 'p' в течение 1 секунды.

6
задан Leonardo 3 June 2013 в 16:09
поделиться

3 ответа

Объявить логическое 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. 
}
7
ответ дан 8 December 2019 в 16:00
поделиться

Вы можете сделать это в масштабе всего приложения, отфильтровав сообщения о нажатии клавиши с помощью 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 для повторяющихся ключей. Не знаю почему.

5
ответ дан 8 December 2019 в 16:00
поделиться

Чтобы предотвратить многократное срабатывание клавиши при удерживании: необходимо использовать свойство 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 .... для получения соответствующей информации

3
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: