【问题标题】:C# Windows Forms KeyDown event fires continiously [duplicate]C# Windows 窗体 KeyDown 事件连续触发 [复制]
【发布时间】:2016-10-13 16:34:20
【问题描述】:

在 Windows 窗体应用程序中,当我使用 Form 的 KeyDown 事件按下热键时,我试图执行某些功能。问题是当我按住热键时,事件会连续触发。

我只想在第一次按下按钮时执行一些功能,在松开按钮时执行另一个功能。

这是我用来完成此操作的代码:

    bool isPressed_Num7 = false;
    bool isPressed_Num9 = false;

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.NumPad7 && !isPressed_Num7)
        {
            isPressed_Num7 = true;
            Console.WriteLine("Keydown 7");
        }

        if (e.KeyData == Keys.NumPad9 && isPressed_Num9)
        {
            isPressed_Num9 = true;
            Console.WriteLine("Keydown 9");
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.NumPad7)
        {
            isPressed_Num7 = false;
            Console.WriteLine("Keyup 7");
        }

        if (e.KeyData == Keys.NumPad9)
        {
            isPressed_Num9 = false;
            Console.WriteLine("Keyup 9");
        }
    }

我将使用一堆热键。那么我要问的是有没有更好的方法来完成我想要做的事情?

【问题讨论】:

  • 如果我们知道你想做什么就好了。
  • 认为他想问的是:我如何不为每个必须在事件处理程序中设置为 true 和 false 的键得到一个变量。
  • 尝试使用Keypress 而不是Keydown,因为只要按住键,Keydown 事件就会循环。
  • @aquinas 这正是我想要做的。

标签: c# winforms keyboard-shortcuts


【解决方案1】:

您可以只使用一个字典而不是每个键一个变量。

Dictionary<Keys, bool> keysPressed = new Dictionary<Keys, bool>();


private void Form1_KeyUp(object sender, KeyEventArgs e)
{
   keysPressed[e.KeyData] = false;
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
   if (!keysPressed.ContainsKey(e.KeyData) || !keysPressed[e.KeyData]) {
         Console.WriteLine(e.KeyData);
         keysPressed[e.KeyData] = true;
   }
}

【讨论】:

  • 这是一个很酷的解决方案。
【解决方案2】:

试试这个:

 bool isPressed_Num7 = false;
bool isPressed_Num9 = false;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if ((e.KeyData == Keys.NumPad7) && (!isPressed_Num7))
    {
        isPressed_Num7 = true;
        Console.WriteLine("Keydown 7");
    }

    if ((e.KeyData == Keys.NumPad9) && (!isPressed_Num9))
    {
        isPressed_Num9 = true;
        Console.WriteLine("Keydown 9");
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if ((e.KeyData == Keys.NumPad7)&&(isPressed_Num7==true))
    {
        isPressed_Num7 = false;
        Console.WriteLine("Keyup 7");
    }

    if ((e.KeyData == Keys.NumPad9)&&(isPressed_Num9==true))
    {
        isPressed_Num9 = false;
        Console.WriteLine("Keyup 9");
    }
}

【讨论】:

    【解决方案3】:

    此解决方案使用 Microsoft 推荐的处理键盘快捷键的方法。并允许您在按下组合键时分配要调用的操作。

    public partial class Form1 : Form
    {
        private readonly IDictionary<Keys, Action> _operationsMap = new Dictionary<Keys, Action>(); 
    
        public Form1()
        {
            InitializeComponent();
            RegisterKeyShortcuts();
        }
    
        private void RegisterKeyShortcuts()
        {
            _operationsMap.Add(Keys.Control | Keys.F, WhenPressingF);
        }
    
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (_operationsMap.ContainsKey(keyData))
            {
                _operationsMap[keyData].Invoke();
                return true;
            }
    
            return base.ProcessCmdKey(ref msg, keyData);
        }
    
        protected void WhenPressingF()
        {
            MessageBox.Show("What the Ctrl+F?");
        }
    }
    

    【讨论】:

    • 什么 Ctrl+F
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2012-10-29
    相关资源
    最近更新 更多