web-dev-qa-db-ja.com

WindowsフォームコンボボックスでEnterキーをキャプチャするにはどうすればよいですか

コンボボックスがアクティブなときに、WindowsフォームコンボボックスでEnterキーをキャプチャするにはどうすればよいですか?

KeyDownとKeyPressをリッスンしようとしましたが、サブクラスを作成してProcessDialogKeyをオーバーライドしましたが、何も機能しないようです。

何か案は?

/ P

17
Presidenten

KeyPressイベントを次のようなメソッドに接続します。

protected void myCombo_OnKeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        MessageBox.Show("Enter pressed", "Attention");                
    }
}

VS2008を使用したWinFormsアプリケーションでこれをテストしましたが、機能します。

それがうまくいかない場合は、コードを投稿してください。

22
Winston Smith

フォームでAcceptButtonを定義した場合、KeyDown/KeyUp/KeyPressでEnterキーを聞くことはできません。

これを確認するには、FORMでProcessCmdKeyをオーバーライドする必要があります。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if ((this.ActiveControl == myComboBox) && (keyData == Keys.Return)) {
        MessageBox.Show("Combo Enter");
        return true;
    } else {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

この例では、コンボボックスを使用している場合にメッセージボックスが表示され、他のすべてのコントロールに対して以前と同じように機能します。

19
Josip Medved

または、代わりに、KeyDownイベントをフックすることもできます。

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        MessageBox.Show("Enter pressed.");
    }
}
9
Petros

これを試して:

protected override bool ProcessCmdKey(ref Message msg, Keys k)
{
    if (k == Keys.Enter || k == Keys.Return)
    {
        this.Text = null;
        return true;
    }

    return base.ProcessCmdKey(ref msg, k);
}
1
Jay
private void comboBox1_KeyDown( object sender, EventArgs e )
{
   if( e.KeyCode == Keys.Enter )
   {
      // Do something here...
   } else Application.DoEvents();
}
1
jay_t55

フォームプロパティでAcceptButtonに設定されているため、ダイアログにEnterキーを使用しているボタンがある可能性があります。
その場合は、コントロールがフォーカスを取得したときにAcceptButtonプロパティを設定解除し、コントロールがフォーカスを失ったときにリセットすることで、このように解決します(私のコードでは、button1は受け入れボタンです)

private void comboBox1_Enter(object sender, EventArgs e)
{
    this.AcceptButton = null;
}

private void comboBox1_Leave(object sender, EventArgs e)
{
    this.AcceptButton = button1;
}

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            MessageBox.Show("Hello");
        }
    }

AcceptButtonプロパティを設定解除/設定するのは少しハッキーだと思われるので、自分のソリューションが気に入らないことを認めなければなりません。誰かがより良いソリューションを持っているなら、私は興味があるでしょう

0
zebrabox
protected void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)  // or Key.Enter or Key.Return
    {
        MessageBox.Show("Enter pressed", "KeyPress Event");                
    }
}

フォームでKeyPreviewをtrueに設定することを忘れないでください。

0
user1694951