как не допустить одновременного нажатия нескольких клавиш? - PullRequest
6 голосов
/ 22 марта 2010

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

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

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

Ответы [ 3 ]

7 голосов
/ 22 марта 2010

Объявите логическое значение 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. 
}
5 голосов
/ 22 марта 2010

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

3 голосов
/ 22 марта 2010

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

...