2012-08-05 3 views
3

저는 C#Windows Forms으로 일하고 있으며 Ctrl+"Oemplus"을 내 응용 프로그램에 대해 key 함수로 사용하고 싶습니다. 나는 German keyboard을 사용하고이 키는 문자 P (즉, "+")의 2 개의 키 오른쪽에 있습니다. Ctrl과 함께이 키를 누르고 초점이 TextBox 인 경우 나는 경고음을냅니다.
US keyboard 레이아웃 (여전히 German keyboard을 사용 중입니다)으로 전환하면이 문제가 발생합니다. 이것은 ] key입니다.
Internet Explorers 주소 표시 줄에있는 동안이 키를 누르면 동일하게 나타납니다. 내 질문은 :Ctrl + "+"를 누르면 텍스트 상자에서 경고음이 울리는 이유는 무엇입니까?


  1. 왜이 키 조합은 텍스트 상자에 경고음을 생산 않습니다.
  2. 어떻게 경고음을 피할 수 있습니까?

아무쪼록 노력해 주셔서 감사합니다.
업데이트 :
나는 미국식/태국어 키보드에서 시도해 봤는데 삐 소리도 들려. 이것은 내가 사용하는 논리적 키보드 레이아웃 (독일어, 미국, 태국)에 관계없이 발생합니다.
경고음은 주소 표시 줄의 Windows 탐색기에서도 발생하지만 검색 창에는 표시되지 않습니다.

+0

아마도 그 당시에는 사용할 수없는 몇 가지 기본 기능이있어 경고음을냅니다.OnPress 또는 OnRelease를 무시하고 해당 조합을 확인하여 처리 된 것으로 표시 할 수 있으므로 경고음이 발생하지 않습니다. – SimpleVar

+0

숫자가 있습니까? + 키를 사용하면 어떻게됩니까? 랩톱 컴퓨터를 사용하는 경우 "Ctrl + Fn + Plus"조합을 사용 하시겠습니까? –

+0

@Yorye Nathan : 이미 응용 프로그램에 다양한 키보드 후크가 있으며 키를 처리 된 것으로 표시합니다. 그것은 여전히 ​​경고음을 울린다. OnPress/OnRelease를 사용하면 OnKeyDown/OnKeyUP을 의미합니까? – DySoS

답변

3

나는 텍스트 상자에 키 조합이 허용되지 않는다고 생각합니다. 따라서 오류가 발생하고 있습니다. 이 코드로 키 조합을 테스트 할 수 있습니다 (EN Windows에서 오른쪽 대괄호 키 사용). SuppressKeyPress을 사용하면 경고음을 방지하기 위해 키 조합이 기본 컨트롤로 전달되지 않습니다.

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (ModifierKeys == Keys.Control) 
     if (e.KeyValue == 221) // You may need to determine this value for your keyboard layout. 
     { 
      textBox1.Text += " + "; // Handle the Key combination. 
      e.SuppressKeyPress = true; // Prevents key from being passed to underlying control 
     } 

} 
+0

답변 해 주셔서 감사합니다. 코드가 작동하기 전에 대답에 언급했듯이. 관련 힌트는 Handled 이외에 SuppressKeyPress를 사용하는 것이 었습니다. – DySoS

7

해당 키 입력을 누를 때 어떤 일이 일어나기를 희망하는지는 분명하지 않습니다. TextBox는 그것에 대해 의심의 여지가 없다. 사용자가 특별한 것을하려고하지만 정확히 알지 못하는 것을 볼 수 있기 때문에 무엇을. 너를 울릴 좋은 이유. 해결 방법은 다음 스 니펫의 // 주석에 마법을 구현하는 것입니다. 마지막에 경고음을 멈추게하는 추가 코드가 있습니다.

private void textBox1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.KeyData == (Keys.Control | Keys.Oemplus)) { 
      // Invoke magic 
      //... 

      // Magic is done now: 
      e.Handled = e.SuppressKeyPress = true; 
     } 
    } 
+0

나는 무언가가 자동적으로 일어나길 기대하지 않는다. 나는 키 스트로크를 직접 처리하고 싶다. 문제는 경고음을 없애지 않는다는 것입니다. 나는 이미 처리 할 키를 설정하는 응용 프로그램 넓은 키보드 후크가 있습니다. 그러나 ist는 아직도 경고음을 울린다. TextBox가 이해할 수 없지만 경고음을 내지 않는 Ctrl + "키 조합"이 많이 있습니다. 이 특정 조합을 처리하기 전에 자동으로 수행해야 할 작업을 이해하고 싶습니다. 따라서 일부 기본 제공 함수가 차단됩니다. 그러나 솔루션이 작동합니다. 부끄러움을 저도 전에 해보지 않았습니다. – DySoS

2

잠시 후 나는 이걸 다시 들었습니다. 이전 솔루션에 만족하지 못했던 점은 모든 TextBox가 내가 다른 용도로 사용하는 모든 '경고음'키를 처리해야한다는 것이 었습니다. 물론 TextBox를 하위 클래스로 만들 수는 있지만 여전히이 동작 (처리 및 경고음 억제)이있는 모든 키에 대해 두 곳을 변경해야합니다.

사실 저는 Ctrl + '+'를 명령 키로 사용합니다. 액션은 모든 폼에서 사용할 수 있어야하고 모든 폼에 영향을 주어야하기 때문에 글로벌 키보드 훅으로이 작업을 수행했습니다. 대신 다음 코드를 사용하여 기본 형태로 지금 처리 : 나이 들어

// Avoid beep on Ctrl+'+' in TextBox. 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     Keys key = keyData & Keys.KeyCode; 
     bool alt = keyData.HasFlag(Keys.Alt); 
     bool shift = keyData.HasFlag(Keys.Shift); 
     bool control = keyData.HasFlag(Keys.Control); 
     if (key == Keys.Oemplus && !shift && control && !alt) 
     { 
      // Perform the action for Ctrl+'+' 
      return true; 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

은 "올바른"위치 및 명령 키를 처리하는 방법을 보인다. 경고음은 추가 처리없이 사라 졌으므로 추가 명령 키가 경고음을 울리더라도 걱정할 필요가 없습니다.

양식에 메뉴 또는 도구 모음이있는 경우이 항목은 메뉴 항목에 정의 된 바로 가기에 의해 자동으로 처리됩니다. 하지만 내 양식에는 메뉴 나 툴바가 없습니다.

+0

* 글로벌 키보드 후크 이외의 다른 *은 유효한 옵션입니다. 'RegisterHotKey' 함수를 호출하는 또 다른 접근법이 있습니다. –

+0

@Cody Grey : RegisterHotKey에 대한 힌트를 가져 주셔서 감사합니다. 또한 글로벌 키보드 후크를 사용하는 것이 잘못된 접근이라는 것을 이해했습니다. – DySoS