Остановите "Дин" при нажатии Enter

У меня очень простое приложение Windows Forms. И в Windows (или, по крайней мере, приложения Windows Forms), когда вы нажимаете Enter, находясь внутри однострочного элемента управления TextBox, вы слышите Ding. Это неприятный звук, указывающий на то, что вы не можете вводить новую строку, потому что это однострочный TextBox.

Все в порядке. Однако в моей форме у меня есть 1 TextBox и кнопка поиска. И я разрешаю пользователю выполнять поиск, нажимая Enter после того, как они набрали текст, поэтому им не нужно использовать мышь, чтобы щелкнуть кнопку "Поиск".

Но этот звук Дин возникает. Это очень раздражает.

Как мы можем сделать так, чтобы звук не воспроизводился вообще в моей форме?

@David H - Здесь, как я обнаруживаю нажатие ввода:

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

Ответ 1

Проверьте свойство Form.AcceptButton. Вы можете использовать его для указания кнопки по умолчанию для формы, в данном случае для нажатия кнопки ввода.

Из документов:

Это свойство позволяет вам назначить действие по умолчанию, которое происходит, когда пользователь нажимает клавишу ВВОД в вашем применение. Кнопка, назначенная это свойство должно быть IButtonControl, который находится на текущем форма или находится в контейнере на текущая форма.

Существует также свойство CancelButton, когда пользователь нажимает escape.

Ответ 2

Это работает для меня:

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;

     }

 }

The SuppressKeyPress - это действительно трюк. Надеюсь, это поможет вам.

Ответ 3

Try

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
    }
}

Ответ 4

Вы можете использовать KeyPress вместо KeyUp или KeyDown более эффективно и здесь, как обращаться с

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

и произнесите мир "Дин"

Ответ 5

Просто добавьте 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.
    }
}

Ответ 6

Используйте 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

      }
   }
}

Ответ 7

Я наткнулся на этот пост, пытаясь обработать KeyDown, это сработало для меня.

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

Подавление нажатия клавиши останавливает событие от отправки в базовый элемент управления. Это должно работать, если вы вручную обрабатываете все, что будет делать ключ ввода в этом текстовом поле. Извините за Visual Basic.

Ответ 8

Есть очень мало шансов, что кто-нибудь доберется до этого ответа, но некоторые другие ответы действительно страшны. Подавление события на 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

Ответ 9

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

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

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

Ответ 10

На WinForms клавиша Enter вызывает звук Ding, потому что свойство формы AcceptButton не указано. Если вам не нужен 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 для элементов управления.

Ответ 11

Установите кнопку поиска IsDefault на true. Это сделает его кнопкой по умолчанию, и при нажатии Enter будет автоматически нажата кнопка.

Ответ 12

Хорошо, я долгое время жил с этой проблемой и смотрел ее здесь.

Подумав об этом в течение довольно долгого времени и желая простейшего способа исправить это, я придумал самый простой, но не очень элегантный способ его исправления.

Вот что я сделал.

  • Поместите две невидимые кнопки "ОК" и "Отмена" в форме.
  • Задайте свойство AcceptButton и CancelButton в форме невидимым кнопкам.
  • Добавлен код для кнопок!

Это позволило решить все вторичные проблемы, перечисленные в этом потоке, включая ToolStripMenu. Моя самая большая жалоба была BindingNavigator, когда я ввел номер записи в текущую позицию, чтобы перейти и нажать enter.

В соответствии с исходным вопросом, в котором программист хотел функцию поиска при нажатии кнопки ввода, я просто поместил код поиска в невидимую кнопку OK!

Пока это, похоже, решает все проблемы, но, как мы все знаем с Visual Studio, что-то, вероятно, возникнет.

Единственный возможный элегантный способ, которым я мог бы подумать, - написать новый класс обработки нажатия клавиш, который позволяет много работать для большинства моих проектов.

Ответ 13

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