2010-01-25 5 views
11

내 응용 프로그램에서 Visual Studio의 키보드 옵션처럼 키보드 단축키를 사용자 정의 할 수있게하고 싶습니다. 사용자는 빈 텍스트 상자에 포커스를두고 명령에 지정할 바로 가기를 입력 할 수 있습니다.WPF에서 사용자 정의 키보드 바로 가기를 읽으려면 어떻게해야합니까?

텍스트 상자에서 실제 텍스트를 입력하지 못하도록 처리하여 설정 한 TextBox.PreviewKeyDown 이벤트를 구독하면 가장 가까이에 있습니다. 그런 다음 수정 자 키와 관련된 KeyDown 이벤트를 무시합니다 (키가 수정 자 키인지 확인하는 더 명확한 방법이 있습니까?).

// Code-behind 
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    // The text box grabs all input 
    e.Handled = true; 

    if (e.Key == Key.LeftCtrl || 
     e.Key == Key.RightCtrl || 
     e.Key == Key.LeftAlt || 
     e.Key == Key.RightAlt || 
     e.Key == Key.LeftShift || 
     e.Key == Key.RightShift) 
     return; 

    string shortcutText = ""; 
    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
     shortcutText += "Ctrl+"; 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
     shortcutText += "Shift+"; 
    if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) 
     shortcutText += "Alt+"; 
    _ShortcutTextBox.Text = shortcutText + e.Key.ToString(); 

} 

위의 내용은 Ctrl 및 Ctrl + Shift로 시작하는 모든 바로 가기에서 작동하지만 Alt 바로 가기 키에서는 실패합니다. Alt를 포함하는 바로 가기를 누르면 e.Key가 항상 Key.System으로 설정됩니다.

사용자로부터 Alt 단축키를 어떻게 녹음합니까? 바로 가기를 사용자가 기록하는 더 나은, 더 강력한 방법 있는가?

+0

Alt 키를 사용하여 Alt 키 콤보 캡처를 시도하여 니모닉 바로 가기 (Alt + F, _File 메뉴 또는 Alt + O) 레이블에 연결된 컨트롤에 초점을 맞추려고했습니다. _OK 버튼의 경우). 어쩌면 그것을 방지하거나 무시할 수있는 방법이 있을까요? –

답변

23

트릭이 SystemKey 속성을 사용하는 것입니다

private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    // The text box grabs all input. 
    e.Handled = true; 

    // Fetch the actual shortcut key. 
    Key key = (e.Key == Key.System ? e.SystemKey : e.Key); 

    // Ignore modifier keys. 
    if (key == Key.LeftShift || key == Key.RightShift 
     || key == Key.LeftCtrl || key == Key.RightCtrl 
     || key == Key.LeftAlt || key == Key.RightAlt 
     || key == Key.LWin || key == Key.RWin) { 
     return; 
    } 

    // Build the shortcut key name. 
    StringBuilder shortcutText = new StringBuilder(); 
    if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) { 
     shortcutText.Append("Ctrl+"); 
    } 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) { 
     shortcutText.Append("Shift+"); 
    } 
    if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) { 
     shortcutText.Append("Alt+"); 
    } 
    shortcutText.Append(key.ToString()); 

    // Update the text box. 
    _ShortcutTextBox.Text = shortcutText.ToString(); 
} 

I 추가 왼쪽 및 오른쪽 Windows 키는 수정 자 목록에 대한 키입니다.이 키는 컴플렉스 (Ctrl+Shift+Alt) 키 조합은 터미널 서버 세션에서 입력되었습니다. 그들은 Keyboard.Modifiers에 존재하지 않지만, 글로벌 단축키를 위해 예약되어 있으므로 거기에서 처리하지 않습니다.

또한 string 인스턴스가 너무 많이 생성되는 것을 피하기 위해 StringBuilder을 사용했습니다.

이 솔루션은 Shift+Alt을 제외한 모든 키 조합에서 작동합니다 (이 경우 Alt 수정자가 표시되지 않음). 내 터미널 서버 환경의 인공물 일 수도 있으므로 귀하의 마일리지가 다를 수 있습니다.

마지막으로, 나는 무슨 일이 일어날 지 확인하기 위해 창에 _File 메뉴를 추가하고, 당신이 원하는 것 같다 메뉴를, 도달하기 전에 Alt+F 바로 가기 키는 효과적으로 텍스트 상자에 의해 갇혀있다.

+0

+1, 내 것보다 나은 해결책. Key 키 = (e.Key == Key.System? e.SystemKey : e.Key); 트릭 :) –

+0

작품! 정말 고맙습니다! –

+0

좋은 하나, 공유 주셔서 감사합니다! – Califf

-1

안녕하세요
You used WPF-Command 경우 응용 프로그램에서 당신은이를 사용할 수 있습니다 다음 Key 속성이 Key.System로 설정되어있는 경우

<Window.InputBindings> 
    <KeyBinding Command="YourCommnad" 
       Gesture="CTRL+C" /> 
</Window.InputBindings> 
+1

이것은 질문에 답하지 않습니다. 질문은 XAML에서 바로 가기 키를 정의하는 방법이 아니라 텍스트 상자에서 키 조합을 읽는 방법입니다. – alexandrudicu

+1

이것은 원래 포스터의 질문에 대답하지 않지만 실제로 이것은 인터넷 검색을 통해이 스레드를 우연히 발견했을 때의 대답입니다. 그래서 다른 사람들에게 2016 년에 이것이 전체 창을 키 바인딩하는 훌륭한 해결책임을 알리고 싶습니다. – Kikootwo

관련 문제