2016-10-13 2 views
0

Windows Form 응용 프로그램에서 Form의 KeyDown 이벤트를 사용하여 단축키를 누르면 일부 기능을 실행하려고합니다. 문제는 내가 단축키를 계속 누르면 이벤트가 계속해서 발생한다는 것입니다.Windows Forms 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?"); 
    } 
} 
관련 문제