2008-10-10 3 views
12

Visual Studio IDE 및 Microsoft Office와 같은 임의의 명령과 연결된 복합 키보드 단축키를 사용할 수있는 구성 요소를 만들고 싶습니다. Ctrl 키+ W +C 같은 여러 키 스트로크의 시퀀스로 이루어진 단축키이다Windows Forms 응용 프로그램에서 복합 키보드 바로 가기를 만드는 방법은 무엇입니까?

. Visual Studio에서이 클래스보기를 엽니 다. 첫 번째 키 세트 (Ctrl + W)를 누르면 "(Ctrl + W)를 눌렀습니다 .. 코드의 두 번째 키를 기다리는 중 ..."이 상태 표시 줄에 나타납니다.

+0

키보드 단축키 코드는 다중 키 바로 가기입니다. Ctrl + W, C와 마찬가지로 클래스 뷰를 엽니 다. 첫 번째 키 집합 (CTRL + W)을 누르면 "(CTRL + W)을 눌렀습니다. 코드의 두 번째 키 대기 중 ..."이 상태 표시 줄에 나타납니다. 이걸 정확히 재현하고 싶습니다. – JJS

+0

WPF에 대한이 구현을 발견했습니다. http://insystusa.com/Products.aspx – JJS

+0

코드의 반대가 아닌가요? –

답변

11

이 시점에서 당신에게 사용할 수있는 기성품 옵션이 있습니다.

그러나 모델링하기에 충분히 간단해야합니다. 아마도 하나의 클래스, 아마도 KeyboardChordProvider을 만들 것입니다. 양식 레벨에서 키보드 이벤트에 대해 알아야합니다.다른 곳에서 설명한 것처럼 Form.KeyPreview 속성은 true이어야합니다. 이 공급자가 Form.KeyPress 이벤트를 구독하는 것으로 충분할 수 있습니다. 양식을 전달한 경우 공급자의 생성자에서이 모든 작업을 수행 할 수 있습니다.

잠재적 인 키 입력을 공급자에게 등록해야합니다.

내부적으로이 인스턴스는 현재 상태를 추적합니다. 코드의 첫 번째 키를 나타내는 키 스트로크가 관찰 될 때마다 구독자가 텍스트를 설정할 수 있도록 공급자의 상태를 업데이트하고 이벤트를 발생시킵니다. (CTRL + W)을 눌렀습니다. 코드의 두 번째 키를 기다리는 중입니다.

다음 키 입력이 잠재적 인 보조 옵션과 일치하면 일치 항목이 생겨 입력 된 스트로크 세부 정보가 포함 된 ChordPressed 이벤트를 발생시킬 수 있습니다. 또는 코드를 등록 할 때 제공자에게 제공된 특정 콜백을 호출 할 수도 있습니다 (ChordPressed 이벤트 처리기에서 switch 문이나 다른 디스패치를 ​​피하기 위해).

언제든지 키 입력이 다음 옵션과 일치하지 않으면 공급자 상태가 재설정됩니다.

공급자 내부에서 트리 구조를 사용하여 가능한 키 입력을 모델링 할 수 있습니다. 공급자의 현재 상태는 특정 트리 노드입니다. 처음에는 루트 노드가 활성화됩니다. 자식이 키 스트로크와 일치하면 다음 스트로크를 예상하여 현재 노드가됩니다. 자식이 리프 노드라면 전체 코드가 일치하고 ChordPressed 이벤트 (해당 지점으로 이동 한 스트로크 체인 전달)를 보내거나 리프에 저장된 콜백을 호출합니다. 키 입력이 아이와 일치 할 때마다 루트 노드를 활성으로 다시 설정합니다.

나는이 디자인이 당신이 원하는 것을 얻을 것이라고 생각합니다.

+0

제안 된 솔루션 Drew에게 감사드립니다. 더 중요한 것은. 응답을 얻지 못해 주셔서 감사합니다. – JJS

+0

이 인터페이스를 여기에 기록하므로 나중에 구성 요소를 구현해야합니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.imessagefilter.aspx – JJS

0

형태의 OnKeyPressed 이벤트를 사용하여 원하는 키 조합을

1

메뉴 컨트롤을 사용하면 값을 할당 할 수있는 속성이 ShortCut 이름 가지고있는 EventArgs 인수에 누를 경우 확인. 해당 바로 가기 키를 누르면 해당 메뉴 항목이 호출됩니다. 해당 메뉴가있는 명령에 해당 특성을 사용하십시오.

메뉴에서 사용할 수없는 바로 가기가 필요한 경우 양식 또는 컨트롤에서 KeyUp 또는 KeyDown 이벤트를 통해 자신을 처리해야합니다. KeyEventArgs 개체가 처리기로 전달되고 어떤 키를 누르고 Ctrl 키, Alt 키 또는 Shift 키를 누를 지 확인할 수 있습니다. MSDN에서

샘플 코드 :

는 버튼 또는 메뉴 항목의 캡션에 앰퍼샌드를 사용하는 몇 가지 답변에 추가
// Handle the KeyDown event to determine the type of character entered into the control. 
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Initialize the flag to false. 
    nonNumberEntered = false; 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     // Determine whether the keystroke is a number from the keypad. 
     if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) 
     { 
      // Determine whether the keystroke is a backspace. 
      if(e.KeyCode != Keys.Back) 
      { 
       // A non-numerical keystroke was pressed. 
       // Set the flag to true and evaluate in KeyPress event. 
       nonNumberEntered = true; 
      } 
     } 
    } 
    //If shift key was pressed, it's not a number. 
    if (Control.ModifierKeys == Keys.Shift) { 
     nonNumberEntered = true; 
    } 
} 
0

, 그것의 원인이됩니다은 를 사용하여 강조하고 접근 할 수 Alt + 앞에 앰퍼샌드 문자 &. 당신이있는 경우 즉

는 메뉴 항목은 Alt 키 + F을 클릭하여 메뉴를 실행할 수있는 F 사용자 아래에 밑줄로 표시됩니다 & 파일을 자막.

0

키보드 단축키의 범위에 따라 다릅니다. 도구 모음을 사용하지 않고 양식의 컨트롤에서 키보드 바로 가기를 사용하려면 양식에

Form.KeyPreview = true; 

을 입력하십시오. 이렇게하면 모든 키 누르기 이벤트가 KeyPress, KeyDownKeyUp 이벤트에 의해 필터링되어 모든 사용자 컨트롤의 기능을 복제하는 대신 하나의 키보드 단축키를 한 위치에서 처리 할 수 ​​있습니다. 구체적으로, 나는 믿지 않는다 키보드 코드의 질문에 대한 대답에서

MSDN: Form.KeyPreview Property

관련 문제