2016-10-13 47 views
0

在Windows窗体应用程序中,我尝试使用Form的KeyDown事件按下热键时执行某个功能。问题是,当我按住热键时,事件不断发生。C#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"); 
     } 
    } 

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

+2

【如何不允许在一个按键收到多个keystokes?](http://stackoverflow.com/questions/2490771/how-not-to-allow-multiple-keystokes-received-at-one -key-press) –

+0

如果我们只知道你在做什么。 –

+0

我*想*他想问的是:如何处理每个必须在事件处理程序中设置为true和false的键的变量。 – aquinas

回答

2

你可能只是一个字典,而不是每个键的一个变量。

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

这是一个很酷的解决方案。 – Brandon

0

试试这个:

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

该解决方案使用的推荐方式,根据微软来处理键盘快捷键。并允许您在按下组合键时分配要调用的操作。

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?"); 
    } 
} 
相关问题