Как мне захватить клавишу ввода в комбинированном окне формы Windows - PullRequest
15 голосов
/ 04 августа 2009

Как получить ключ ввода в поле со списком форм Windows, когда комбинированный список активен?

Я пытался прослушать KeyDown и KeyPress и создал подкласс и переопределил ProcessDialogKey, но, похоже, ничего не работает.

Есть идеи?

/ P

Ответы [ 7 ]

18 голосов
/ 04 августа 2009

Подключите событие KeyPress к методу, подобному этому:

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

Я проверил это в приложении WinForms с VS2008, и оно работает.

Если это не работает для вас, пожалуйста, оставьте свой код.

17 голосов
/ 04 августа 2009

Если вы определили AcceptButton в своей форме, вы не сможете прослушать клавишу ввода в KeyDown / KeyUp / KeyPress.

Чтобы проверить это, вам необходимо переопределить ProcessCmdKey в FORM:

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

В этом примере это выдаст вам окно сообщения, если вы находитесь в поле со списком, и оно работает как и раньше для всех других элементов управления.

9 голосов
/ 04 августа 2009

или, альтернативно, вы можете подключить событие KeyDown:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        MessageBox.Show("Enter pressed.");
    }
}
1 голос
/ 04 февраля 2010

Попробуйте это:

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 голос
/ 07 августа 2009
private void comboBox1_KeyDown( object sender, EventArgs e )
{
   if( e.KeyCode == Keys.Enter )
   {
      // Do something here...
   } else Application.DoEvents();
}
0 голосов
/ 18 марта 2016
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 голосов
/ 04 августа 2009

Возможно, в вашем диалоговом окне есть кнопка с ключом ввода, поскольку в свойстве формы для него задано значение AcceptButton.
Если это так, то вы решаете это следующим образом: для этого необходимо сбросить свойство 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, поэтому, если у кого-то есть лучшее решение, то мне будет интересно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...