2016-10-13 43 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?"); 
    } 
} 
相關問題