Enterキーを押したときに「Ding」を停止します


124

非常にシンプルなWindowsフォームアプリケーションがあります。また、Windows(または少なくともWindowsフォームアプリケーション)では、単一行のTextBoxコントロール内でEnterキーを押すと、Dingが聞こえます。これは不快な音で、単一行のTextBoxであるため、改行を入力できないことを示しています。

これで結構です。ただし、フォームには1つのTextBoxと1つの検索ボタンがあります。そして、私は、ユーザーが、彼らが完成タイピングをした後、彼らはしていないので、Enterキーを押して検索を実行することができています持って検索ボタンをクリックしてマウスを使用します。

しかし、この丁音が発生します。それは非常に迷惑です。

フォームでそのサウンドがまったく再生されないようにするにはどうすればよいですか?

@David H-Enterキーを検出する方法は次のとおりです。

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

テキストボックスにフォーカスがあるときにEnterキーが押されたことをどのように検出しますか?
David Heffernan

プロパティペインで、KeyDownまたはKeyUpイベントをダブルクリックします。次に、コードビューで、質問に入力するコードを入力します。
bendr

2
KeyPressはおそらく適切なイベントであり、e.Handled = trueを設定したい
David Heffernan

ありがとう、@ David、私はこれを知らなかった:)
bendr

7
迷惑な音を抑える方法があったらいいのにと思いますが、キーを押すのを吹き飛ばします。場合によっては、キーを押すだけでキーを押すだけで、アラームは必要ありません。
フリップダウト2009

回答:


56

Form.AcceptButtonプロパティを確認してください。これを使用して、フォームのデフォルトボタンを指定できます。この場合は、Enterキーを押します。

ドキュメントから:

このプロパティを使用すると、ユーザーがアプリケーションでEnterキーを押したときに発生するデフォルトのアクションを指定できます。このプロパティに割り当てられるボタンは、現在のフォーム上にあるか、現在のフォーム上のコンテナー内にあるIButtonControlである必要があります。

ユーザーがエスケープを押したときのCancelButtonプロパティもあります。


1
@mdmに感謝します。これは私にとって最も効果的でした。:)担当者が増えると、賛成投票に戻ります。
bendr 2011年

1
@bendr私は同じ問題がありますが、UserControlを使用しています.. Form.AcceptButtonがありません..それを修正する方法は?
Murhaf Sousli

1
Visual Studioの[プロパティ]ペインには、このフィールドがないようです。どうやら、コードで行う必要があります。this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
これはToolStripButtonsでは機能せず、Enterキーを使用してTextBoxまたはToolStripTextBoxを検証する場合は機能しません。より良いアプローチは、ToolStripTextBoxで私のために働いたLucio Fonsecaの答えです。
ロバートS.

私はあなたの解決策を見ることができません。もっと啓発するための実践的な演習がない
ペドロ・アビラ

197

わたしにはできる:

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 2013

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

2
ユーザーがTabキーを押すと、フォーカスはTextBoxになくなります。フォーカスされる次の制御はボタンコントロールであり、Enterキーを押しても音は鳴りません。:-)
bendr

@David、あなたの例に感謝します。試してみたところです。そして、.KeyPressイベントにe.Handled = trueを入れると、他のコードは実行されません。起こる唯一のことは、TextBox内のすべてのテキストが選択されることです(そして、テキストを選択するコードさえありません)
bendr

1
ルシオ・フォンセカの答えは、私が問題に対処するために見つけた唯一のものでした。
Jonathon Reinhart 2013

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();
        }
    }

「丁」に平和を言う


2
これは完璧に機能しました。e.Handledは明らかに 'Ding'を無効にします。[送信]ボタン(私の場合)をデフォルトにしても、フォームの他のテキストボックスでは[Enter]キーを別の方法で処理したかったため、うまくいきませんでした。<br/> <br/>ちなみに:このプロジェクトではVBを使用しています。e.KeyCharをキャストする代わりに、変換します:if e.KeyChar = ChrW(Keys.Enter Then ....
Mark Ainsworth

1
内ではKeyDown、使用e.Handlede.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、1回のストライクで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
        }
    });

これは私が探しているものです。
2014年

1

WinFormsでは、フォームプロパティAcceptButtonが指定されていないため、Enterキーを押すとDingサウンドが鳴ります。AcceptButtonが必要ない場合は、KeyPreviewフォームをtrueに設定し、次のKeyPressイベントを入力することで、音を抑えることができます。

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

どのコントロールがアクティブであっても、Enterキーを押しても音は鳴りません。キーイベントの処理順序はKeyDownであるため、コントロールのKeyDownイベントに対してEnterキーは引き続き機能します。


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つの非表示ボタン「OK」と「キャンセル」を配置します。
  2. フォームのAcceptButtonプロパティとCancelButtonプロパティを非表示のボタンに設定します。
  3. ボタンにコードを追加しませんでした!

これにより、ToolStripMenuを含むこのスレッドにリストされているすべての二次的な問題が解決されました。私の最大の不満は、BindingNavigatorでした。レコード番号をCurrent位置に入力して、ナビゲートしてEnterキーを押しました。

Enterボタンが押されたときにプログラマーが検索機能を必要としていたという元の質問のとおり、検索コードを非表示の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 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.