2016-10-24 3 views
2

내 WPF 응용 프로그램에 바로 가기를 보내려면 사용자 입력을 받아야합니다. 키를 누를 때
캐치 :
나는 이런 식으로 뭔가를해야 할이 인터넷에서 찾을

Catch Alt + 기타 단축키

및 KeyPressed 정적 부울 변수 클래스가 잡을 것입니다
void keyDown(object sender, KeyEventArgs e) { 
if ((Keyboard.Modifiers & Modifiers.Shift) == Modifiers.Shift) 
{ 
KeyPressed.SetShift(true); 
} 
if (Key.Shift != e.Key && Key.LeftAlt != e.Key && ....) 
{ 
KeyPressed.SetKey(e.Key); 
} 

⇧Shift, 경우 Alt 키 또는 Ctrl 키 다른 키는 012에 Alt 키 대신 Ctrl 키와 (⇧Shift을 누르면절). 두 번째 ifAlt, , ⇧Shift, 단축키 제어와 다른 키를 잡는 것입니다. 예를 들어, C + 바로 가기 Alt 키 위해 우리는이 :

  1. KeyPressed.Shift = 거짓;
  2. KeyPressed.Alt = true;
  3. KeyPressed.Ctrl = false;
  4. KeyPressed.key = Key; 마지막 요소 유형 System.Window.Input.Key이다

. 키가 해제
캐치 : 내가 제대로 다음 바로 가기를 잡기 위해 false로 모든 키를 설정 그 후

void keyUp(object sender, KeyEventArgs e) { 
if(KeyPressed.getShift()) 
this.textField.Text += "+Shift"; 
if(KeyPressed.getKeyCode()) 
this.textField.Text += "+" + KeyPressed.k.toString(); 
KeyPressed.SetShift(false); 

} 

여기에 단순히 I는 입력받은 텍스트 입력란에 추가합니다.

이 코드는 같은 모든 바로 가기를 위해 잘 작동 Ctrl 키 + , Ctrl 키 + Alt 키 + C, ⇧Shift + L, Alt 키, 그러나 나는 바로 가기를 누를 때 likealt + v,alt, 다른 키가 아닙니다.
어떻게 관리 할 수 ​​있습니까?
더 좋은 방법으로 바로 가기를 처리 할 수있는 방법이 있습니까? 고맙습니다.

+0

더 나은 방법 : [InputBindings] (https://msdn.microsoft.com/en-us/library/system.windows.input.inputbinding (v = vs.110) .aspx), [이 기사 참조] 자세한 내용은 https://wpf.2000things.com/tag/inputbindings/)을 참조하십시오. –

답변

1

SystemKey (Alt 등)의 경우 실제 키를 가져와야하는 경우이 도우미 함수를 사용하여 시스템 키 뒤에 실제 키를 가져올 수 있습니다.

public static Key RealKey(this KeyEventArgs e) 
{ 
    switch (e.Key) 
    { 
     case Key.System: 
      return e.SystemKey; 

     case Key.ImeProcessed: 
      return e.ImeProcessedKey; 

     case Key.DeadCharProcessed: 
      return e.DeadCharProcessedKey; 

     default: 
      return e.Key; 
    } 
} 

자세한 내용은 내 대답 here을 확인할 수 있습니다.

+0

고맙습니다. (물론) 잘 작동합니다. 다른 대답은 매우 도움이됩니다. –

0

Alt-modifier 상태를 로컬 변수에 저장하십시오.왜 그런지 잘 모르겠지만, 이것이 저에게 효과적이었습니다.

private bool _altModifierPressed = false; 

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    _altModifierPressed = (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)); 

    if (_altModifierPressed && Keyboard.IsKeyDown(Key.V)) 
    { 
     // code to handle Alt + V 
    } 
} 

UPDATE : 또는

, 당신은이 같은 (지역 변수 필요 없음)

if (((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) && Keyboard.IsKeyDown(Key.V)) 
{ 
    // code to handle Alt + V 
} 

을 할 수 그러나 열거가이 있기 때문에 내가 (두 접근 방식 것으로 나타났습니다 플래그 속성) Alt & V을 포함한 모든 키 조합이 작동합니다. 그래서 만약 내가 예를 들어 을 누르십시오. + G + V입니다. 행운을 빕니다.