首页 > 解决方案 > c#中的按键检测和发送

问题描述

所以我想做的是找到我是否完全按下了空格键,而我希望释放空格键,然后在大约 10 毫秒的延迟内再次按下多次。我试图阅读和理解这个链接(https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx)但它仍然混淆任何帮助?我是 c# 的新手,但我对 pascal 有一些经验,我发现其中非常相似(使用 Visual Studio 2015,因为我的电脑不允许我更新到 Windows 8.1)

标签: c#visual-studiokeypressonkeypress

解决方案


10ms delay意味着每秒100次,没有人能做到。

关键事件按以下顺序发生:

  1. 按键
  2. 按键
  3. 键升

事件KeyDownKeyUp使用KeyEventArgs, while KeyPressis KeyPressEventArgs,

KeyEventArgs可以详细说明同时按下了多少个键。KeyEventArgs.KeyCodeKeys一个[Flags]枚举,它可以包含多个键,如 CTRL+SHIft+F+G

如果您的热键是 Ctrl+Shift+Space,您可以检查:

var hotkeyPressed = e.Control && e.Shift && e.KeyCode == Keys.Space;

如果您的热键是 Ctrl+F10+Space,您可以检查:

var hotkeyPressed = e.Control && e.KeyCode == (Keys.Space | Keys.F10);

但不要使用:

var hotkeyPressed = e.Control && e.KeyCode.HasFlag(Keys.F10) && e.KeyCode.HasFlag(Keys.Space); // e.KeyCode probably contains other flags

KeyPressEventArgs.KeyChar是一个字符串,看看源码,关注它的注释

  [ComVisible(true)]
  public class KeyPressEventArgs : EventArgs
  {
    ...
    /// <summary>Gets or sets the character corresponding to the key pressed.</summary>
    /// <returns>The ASCII character that is composed. For example, if the user presses SHIFT + K, this property returns an uppercase K.</returns>
    public char KeyChar { get; set; }
    ...
  }

使用哪个事件,这取决于您的要求。这是 KeyDown 中的示例代码:

    private int counting = 0, limit = 10;
    private void txt_KeyDown(object sender, KeyEventArgs e)
    {
        if (!e.KeyCode.HasFlag(Keys.Space)) //check if your expected key is pressed
        {
            counting = 0;
            return;
        }
        //start counting
        counting++;

        if (counting > limit)
        {
            e.Handled = true;
            //do you business work, like: Send something somewhere

        }
        else
        {
            //do something else, like: show the number 'counting' in GUI
        }
    }

如果您想限制下一个空间的时间跨度,请使用计时器

    private void txt_KeyDown(object sender, KeyEventArgs e)
    {
        timer1.Stop();
        if (!e.KeyCode.HasFlag(Keys.Space))
        {
            counting = 0;
            return;
        }
        //start counting
        timer1.Start();
        counting++;

        if (counting > limit)
        {
            e.Handled = true;
            //do you business work, like: Send something somewhere

        }
        else
        {
            //do something else, like: show the number 'counting' in GUI
        }
    }

    //timer1.Interval = 100; //100ms timeout. user has to press space again within 100ms
    private void timer1_Tick(object sender, EventArgs e)
    {
        counting = 0;
    }

推荐阅读