Enter를 누를 때 'Ding'중지


124

매우 간단한 Windows Forms 응용 프로그램이 있습니다. 그리고 Windows (또는 적어도 Windows Forms 응용 프로그램)에서 한 줄 TextBox 컨트롤 내부에서 Enter 키를 누르면 딩이 들립니다. 그것은 한 줄 TextBox이기 때문에 개행을 입력 할 수 없음을 나타내는 불쾌한 소리입니다.

괜찮습니다. 그러나 내 양식에는 1 개의 TextBox와 검색 단추가 있습니다. 그리고 사용자가 입력을 완료 한 후가되지 않도록, Enter 키를 눌러 검색을 수행 할 수 있도록하고 있는 검색 버튼을 클릭 마우스를 사용 할 수 있습니다.

하지만이 딩 소리가 발생합니다. 매우 성가신 일입니다.

내 양식에서 소리가 전혀 재생되지 않도록하려면 어떻게해야합니까?

@David H-Enter 누름을 감지하는 방법은 다음과 같습니다.

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}

텍스트 상자에 포커스가있을 때 Enter 키를 눌렀는지 어떻게 감지합니까?
David Heffernan 2011-06-09

속성 창에서 KeyDown 또는 KeyUp 이벤트를 두 번 클릭합니다. 그런 다음 코드보기에서 내 질문에 yah에 대한 코드를 입력합니다.
bendr

2
키를 누를 때 아마 바로 이벤트입니다, 당신은 e.Handled 사실 = 설정할
데이비드 헤퍼을

감사합니다, @David, 나는 이것을 몰랐습니다 :)
bendr

7
성가신 소리를 억제 할 수있는 방법이 있었으면하지만 키를 누르면 거품이 일어납니다. 때때로 키 누름은 단지 키 누름이며 알람이 필요하지 않습니다.
flipdoubt 2011 년

답변:


56

Form.AcceptButton 속성을 확인하십시오 . 이를 사용하여 양식의 기본 단추를 지정할 수 있습니다.이 경우에는 Enter를 누르십시오.

문서에서 :

이 속성을 사용하면 사용자가 응용 프로그램에서 Enter 키를 누를 때 발생하는 기본 작업을 지정할 수 있습니다. 이 속성에 할당 된 단추는 현재 폼에 있거나 현재 폼의 컨테이너 내에있는 IButtonControl이어야합니다.

사용자가 이스케이프를 누를 때를위한 CancelButton 속성 도 있습니다 .


1
@mdm 감사합니다. 이것이 저에게 가장 효과적이었습니다. :) 나는 더 많은 담당자가있을 때 다시 찬성 할 것이다.
bendr

1
@bendr 나는 .. 같은 문제가 있지만 UserControl .. 사용하는 메신저는 Form.AcceptButton .. 그것을 수정하는 방법이 없습니까?
Murhaf Sousli

1
Visual Studio의 속성 창에 이에 대한 필드가없는 것 같습니다. 분명히 코드로 이루어져야합니다. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
크리스

5
ToolStripButtons 또는 Enter 키를 사용하여 TextBox 또는 ToolStripTextBox의 유효성을 검사하려는 경우에는 작동하지 않습니다. 더 나은 접근 방식은 ToolStripTextBox로 나를 위해 일한 Lucio Fonseca의 대답입니다.
Robert S.

좀 더 계몽 할 당신이 실제적인 운동을하지 않는 솔루션을 볼 수 없습니다
페드로 아빌라을

198

나를 위해 작동합니다.

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

    //Se apertou o enter
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down

        this.doSomething();

        e.Handled = true;
        e.SuppressKeyPress = true;

     }

 }

SuppressKeyPress는 정말 트릭입니다. 도움이 되었기를 바랍니다.


30
제 생각에는 이것이 유일하게 유효한 대답입니다. e.Handled = true;불충분했습니다. SuppressKeyPress트릭을 한 것이 바로 그것 입니다.
Jonathon Reinhart

12
textBox1_KeyUp은 Handled 또는 SuppressKeyPress에 관계없이이 상황에서 소리를냅니다
stackuser83

4
나를 위해 작동합니다 ToolStripTextBox.KeyDown. 다른 해결책은 없습니다. 감사!
Robert S.

1
그것은 내에서 나를 위해 작동하지 않았다 textboxKeyDown이벤트
알렉스 졸릭에게

7
이것은 받아 들여진 대답이어야합니다. 현재 허용되는 답변에는 불쾌한 양식에 배치 된 표준 버튼이 필요합니다.
Javid

56

시험

textBox.KeyPress += new KeyPressEventHandler(keypressed);

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true; //this line will do the trick
    }
}

맞지만 포커스가 여전히 TextBox에있는 경우에만 작동합니다. 사용자가 Tab먼저 누르면 어떨까요?
MDM

4
@mdm UI 디자인에 따라 다릅니다. 아마도 OP는 포커스가 텍스트 상자에있을 때만이 작업을 원할 것입니다. 그것은 매우 일반적입니다.
David Heffernan 2011-06-09

2
사용자가 Tab을 눌렀을 경우 포커스가 더 이상 TextBox에 있지 않고 포커스를받을 다음 Contorl은 Enter 키를 눌러도 소리가 나지 않는 Button 컨트롤입니다. :-)
bendr

@David, 예를 들어 주셔서 감사합니다. 나는 그것을 시도했다. 그리고 .KeyPress 이벤트에 e.Handled = true 를 넣을 때마다 다른 코드는 실행되지 않습니다. 발생하는 유일한 일은 TextBox의 모든 텍스트가 선택되는 것입니다 (텍스트를 선택하는 코드도 없음)
bendr

1
Lucio Fonseca의 대답은 내가 문제를 해결하는 유일한 방법이었습니다.
Jonathon Reinhart

15

e.SuppressKeyPress = true;"if"문을 추가 하기 만하면 됩니다.

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //If true, do not pass the key event to the underlying control.
        e.SuppressKeyPress = true;  //This will suppress the "ding" sound.*/

        // Perform search now.
    }
}

13

KeyUp 또는 KeyDown 대신 KeyPress를 더 효율적으로 사용할 수 있으며 처리 방법은 다음과 같습니다.

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            e.Handled = true;
            button1.PerformClick();
        }
    }

그리고 'Ding'에게 평화를 전하세요


2
이것은 나를 위해 완벽하게 작동했습니다. e. Handled는 분명히 'Ding'을 비활성화합니다. '제출'버튼 (제 경우)을 기본값으로 설정하면 양식의 다른 텍스트 상자에 대해 'Enter'키를 다르게 처리하고 싶었 기 때문에 효과가 없었을 것입니다. <br/> <br/> 그런데 :이 프로젝트에서는 VB를 사용하고 있습니다. 그래서 대신 e.KeyChar 주조, 나는 그것을 변환 : e.KeyChar = CHRW (Keys.Enter 그리고 .... 경우
마크 워스

1
내에서 KeyDown사용 e.Handled하고 e.SuppressKeyPress나를 위해 작동하지 않았습니다. 그러나 여기에서 제안한대로 KeyPress' event and e.Handled 를 사용하도록 변경하면 멋지게 처리되었습니다.
Jinlye

정답이어야합니다. 감사합니다
Firas Shrourou

7

SuppressKeyPress키 입력을 처리 한 후 계속되는 처리를 중지하는 데 사용 합니다.

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

   private void EntryTextBox_KeyDown(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         e.Handled = true;
         e.SuppressKeyPress = true;
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
          e.Handled = true;
          e.SuppressKeyPress = true;
          // do some stuff

      }
   }

   private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
         // do some stuff

      }
   }
}

2

나는 이것이 나를 위해 일한 KeyDown을 처리하려고 시도하는 동안이 게시물을 우연히 발견했습니다.

If e.KeyCode = Keys.Enter Then
   e.SuppressKeyPress = True
   btnLogIn.PerformClick()
End If

키 누르기를 누르면 이벤트가 기본 컨트롤로 전송되는 것을 중지합니다. 해당 텍스트 상자 내에서 Enter 키가 수행하는 모든 작업을 수동으로 처리하는 경우 작동합니다. Visual Basic에 대해 죄송합니다.


2

누군가이 답변에 도달 할 가능성은 거의 없지만 다른 답변은 정말 무섭습니다. 이벤트를 억제하면 KeyDown한 번의 공격으로 2 개의 추가 이벤트를 죽입니다. 이 컨텍스트에서 e.Handled속성을 true로 설정 하는 것은 쓸모가 없습니다.
가장 좋은 방법은 Form.AcceptButton속성을 실제 검색 버튼으로 설정하는 것입니다. 키
를 사용하는 또 다른 방법이 있습니다. Enter어떤 사람들은 키를 TAB버튼으로 사용 하기를 원할 수 있습니다 . 이를 위해 새를 추가하고 Button해당 Location속성을 Form영역 외부에 (-100, -100)설정 Visible합니다 (예 : 속성을로 설정 하면 경우에 따라 핸들러 false가 비활성화 될 수 있음) Button. Form.AcceptButton새 버튼에 속성을 설정 합니다. 에서 Click이벤트 처리기에 다음 코드를 추가
this.SelectNextControl(ActiveControl, true, true, true, true)

지금, 당신은 양도 할 수 있습니다 focus경우에만 focus그것을 TextBox중 하나를 테스트 할 수 있습니다 당신 ActiveControl종류 나 사용 e.Supress을 사용하는 것은 아닙니다 컨트롤의 이벤트 핸들러 재산 Enter으로 TAB 그 그것 뿐이다. 캡처 할 필요도 없습니다.e.KeyCode


1
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

            e.Handled = true; //This will prevent the "ding" sound

            //Write the rest of your code
        }
    });

이것이 제가 찾고있는 것입니다.
Sid

1

WinForms에서 양식 속성 AcceptButton이 지정되지 않았기 때문에 Enter 키는 딩 소리를 발생시킵니다. AcceptButton이 필요하지 않은 경우 KeyPreview 양식을 true로 설정하고 다음 KeyPress 이벤트를 입력하여 딩 소리를 억제 할 수 있습니다.

private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
        e.Handled = true;
}

어떤 컨트롤이 활성화되어 있더라도 Enter 키를 누를 때 더 이상 딩 소리가 나지 않습니다. 키 이벤트 처리 순서는 KeyDown, KeyPress 및 KeyUp이므로 Enter 키는 컨트롤의 KeyDown 이벤트에 대해 계속 작동합니다.


0

검색 단추의 IsDefault 속성을 true. 그러면 기본 버튼이되고 Enter 키를 누르면 자동으로 클릭됩니다.


워드 프로세서에서 당신은 연결To specify the default button of a form, set the AcceptButton property of the form to the desired button.
MDM

예, 직접 조사했습니다. 두 가지 접근 방식 모두 상호 교환이 가능한 것 같습니다. AcceptButton좀 더 스타일리시 해 보이지만 IsDefault나 자신 에게 익숙하다 .
Zruty

0

글쎄, 나는이 문제를 충분히 오래 살았고 여기에서 찾아 보았습니다.

이것에 대해 꽤 오랫동안 생각하고 그것을 고치는 가장 간단한 방법을 원한 후에 나는 그것을 고치는 가장 쉽지만 그렇게 우아하지는 않은 방법을 생각해 냈습니다.

여기 내가 한 일이 있습니다.

  1. 두 개의 보이지 않는 버튼 "확인"및 "취소"를 양식에 입력하십시오.
  2. 폼의 AcceptButton 및 CancelButton 속성을 보이지 않는 단추로 설정합니다.
  3. 버튼에 코드를 추가하지 않았습니다!

이것은 ToolStripMenu를 포함하여이 스레드에 나열된 모든 2 차 문제를 해결했습니다. 가장 큰 불만은 BindingNavigator였습니다. 현재 위치에 레코드 번호를 입력하여 탐색하고 엔터를 눌렀을 때입니다.

프로그래머가 엔터 버튼을 눌렀을 때 검색 기능을 원했던 원래 질문에 따라 보이지 않는 OK 버튼에 검색 코드를 입력하기 만하면됩니다!

지금까지 이것은 모든 문제를 해결하는 것처럼 보이지만 우리 모두가 Visual Studio를 사용하여 알고 있듯이 뭔가 문제가 발생할 수 있습니다.

내가 생각할 수있는 유일한 다른 우아한 방법은 대부분의 프로젝트에서 많은 작업을 수행하는 새로운 키 입력 처리 클래스를 작성하는 것입니다.


0

텍스트 상자 여러 줄을 true로 설정 한 다음 Enter 키 누르기를 처리 할 수 ​​있습니다.

private void yourForm_Load(object sender, EventArgs e)
    {
        textBox1.Multiline = true;
    }

//then write your TextBox codes
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // doSomething();
    }
}

0

여러 줄 텍스트 상자의 텍스트 상자 속성을 변경했는데 저에게 효과적입니다.


답변은 이미 2 월 22 일에 아래에 명시되어 있습니다. [enter]도 돌봐야합니다;)
Goodies

-2
void RTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == Keys.Enter)
    {
        //do ...
        bool temp = Multiline;
        Multiline = true;
        e.Handled = true;
        Multiline = temp;
    }
}

1
이것은 코드 만 있고 설명이없는 중복 답변입니다. 또한 모든 Multiline코드는 완전히 관련이 없습니다.
Jonathon Reinhart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.