c# Windows窗体KeyDown事件连续触发

本文关键字:连续 事件 KeyDown Windows 窗体 | 更新日期: 2023-09-27 18:12:53

在Windows窗体应用程序中,当我使用窗体的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");
        }
    }

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

c# Windows窗体KeyDown事件连续触发

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

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

试试这个:

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

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

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?");
    }
}