2009-12-30 3 views
7

단일 텍스트 상자가있는 양식이 있습니다. 다른 컨트롤은 없습니다. '입력'키 또는 'Esc'키를 입력 할 때마다 양식이 원하는대로 작동합니다. 하지만 그 끔찍한 Windows 오류 소리를 들었어요. 코드는'Enter'또는 'Esc'를 입력 할 때 창 오류 사운드를 중지하는 방법

public class EntryForm: Form 
{ 
    public EntryForm() 
    { 
    } 

    private void EntryTextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
    if(e.KeyCode == Keys.Enter) 
    { 
     // do some stuff 
     Hide(); // I've also used DialogResult = DialogResult.OK here 
     e.Handled = true; 
    } 
    else if(e.KeyCode == Keys.Escape) 
    { 
     Hide(); // I've also used DialogResult = DialogResult.Cancel here 
     e.Handled = true; 
    } 
    } 
} 

내가 '해킹'폼의 생성자에 다음 코드를 추가하여 노이즈 정지를 할 수 있습니다 ... 다음과 비슷합니다.

AcceptButton = new Button(); 
CancelButton = new Button(); 

내가 말했듯이 이것은 사운드가 재생되지 않게하지만 이것은 잘못된 형태라고 생각합니다. 특히 양식에 단추가 필요 없기 때문에 특히 그렇습니다.

누구나 이것이 동작이며 오류 사운드 재생을 중단하는 더 깨끗한 방법이 있다면 누구나 알 수 있습니까?

+0

버튼이없는 경우 Enter 키 또는 Esc 키를 눌렀을 때 대화 상자가 사라지는 방식은 무엇입니까? jus 편집 컨트롤이있는 양식은 일반적으로 Enter 또는 Esc를 눌렀을 때 거기에 있습니다. –

+0

@ John Knoeller - Hide() 메서드는 폼을 숨 깁니다. visible 속성을 false로 설정할 수도 있습니다. 양식을 모달로 표시 한 경우 코드에서 대화 상자 결과를 설정하면 양식이 사라집니다. –

답변

6

Windows Forms 디자인 모델의 컨트롤 수에 관계없이 작동하는 "올바른"픽스가 있습니다. 양식에이 코드를 붙여 넣으십시오.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == Keys.Escape || keyData == Keys.Enter) { 
    this.Hide(); 
    return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

@nobugz - 이것은 챔피언처럼 작동했습니다. 감사. –

12

KeyDown 이벤트에서 e.Handled = truee.SuppressKeyPress = true을 설정하십시오.

+0

@Andrew - 이렇게하면 행동에 아무런 영향을 미치지 않습니다. 그래도 전에 SuppressKeyPress 속성을 본 적이 없으므로 답변 해 주셔서 감사합니다. –

+0

이것은 나를 위해 일했습니다. – kervin

+0

나를 위해 일했습니다! 고마워요 :) – Jake

2

이 메시지는 메모에 적합하지 않을 수 있습니다. 양식에 상관없이 활성화되고 키보드 입력 포커스가 양식에 제어하는 ​​ 숨겨진되지 않을 것입니다

  1. , 그리고는 'KeyPreview 양식이 있는지 여부와 무관 : 당신이 Nobugz 코드를 사용하는 경우와 같이 속성을 '참'또는 '거짓'으로 설정하십시오. 물론

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
        if (msg.HWnd == textBox1.Handle) 
        { 
         if (keyData == Keys.Escape || keyData == Keys.Enter) 
         { 
          textBox1.Hide(); 
          return true; 
         } 
        } 
        return base.ProcessCmdKey(ref msg, keyData); 
    } 
    

    은 당신이 원하는 경우 : 여기

는 (이 경우을 textBox1 '라는 이름의 텍스트 상자는) 오버 라이드 ProcessCmdKeys에 숨길 수 만 특정 컨트롤을 만들기 위해해야 ​​할 일이다 여러 컨트롤을 숨길 필요가있는 경우를 처리하면 switch 문이나 msg를 테스트하는 모든 것을 구현할 수 있습니다 .HWnd : note 여기서 키보드 입력을 가질 수있는 모든 컨트롤에 유효한 HWnd가 있다고 가정합니다.

이 기술을 사용하고 텍스트 입력 컨트롤에 여전히 키보드 입력 포커스가있는 상황 (다소 애매함) ... 내가 의도하지 않은 경우 ... 나를 추가하려고합니다. 다음과 같은 추가 테스트 :

&& this.ActiveControl == textBox1 

그러나 나는 그것이 확실하다고 확신 할 수 없기 때문에 "소금 입자"로 가져갑니다.

+0

@BillW - 추가 정보를 제공해 주셔서 감사합니다. 이 경우 전체 양식을 숨기고 싶습니다. 그러나 정보는 미래를 알기에 좋다. –

관련 문제