how not to allow multiple keystokes received at one key press?

[亡魂溺海] 提交于 2019-12-18 08:08:16

问题


when we press a key and keep pressing it the keypress and keydown event continuously fires. Is there a way to let these fire only after a complete cycle ,eg keydown and then key up.

I would like the user not to be able press the key continuously rather would like the user have to press then release the key board to type a character !

so that following case do not occur eg : pppppppppppppppppppppppp when user presses 'p' for 1 sec.


回答1:


Declare a boolean isKeyDown, in theKeyDown Event, set the boolean to true. In the KeyUp event, set the boolean to false.

This is sample code

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. 
}



回答2:


You can do it application-wide by filtering the key down messages with IMessageFilter. Here's an example:

  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;
    }
  }

One thing I pursued is the repeat count in the WM_KEYDOWN message. Oddly this didn't work on my machine, it was 1 for repeating keys. Not sure why.




回答3:


To prevent a key from firing multiple-times when held down : you must use the SuppressKeyPress property like so :

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;
}

See : KeyEventArgs..::.Handled Property ... and ... KeyEventArgs..::.SuppressKeyPress Property .... for relevant information



来源:https://stackoverflow.com/questions/2490771/how-not-to-allow-multiple-keystokes-received-at-one-key-press

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!