Как захватить ключ ввода в виде окна со списком окон

Как я могу захватить ключ ввода в поле со списком окон при активном выделении?

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

Любые идеи?

/P

Ответы

Ответ 1

Подключите событие KeyPress к следующему методу:

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

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

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

Ответ 2

Если вы определяете AcceptButton в своей форме, вы не можете прослушивать клавишу Enter в 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);
    }
}

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

Ответ 3

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

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

Ответ 4

private void comboBox1_KeyDown( object sender, EventArgs e )
{
   if( e.KeyCode == Keys.Enter )
   {
      // Do something here...
   } else Application.DoEvents();
}

Ответ 5

Попробуйте следующее:

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

Ответ 6

Возможно, в вашем диалоговом окне есть кнопка, в которой есть ключ ввода, потому что он установлен как свойство AcceptButton в свойстве формы.
Если это так, тогда вы решаете это как это, отключив свойство AcceptButton, когда элемент управления получает фокус, а затем сбросьте его назад, когда элемент управления теряет фокус (в моем коде кнопка 1 является кнопкой подтверждения)

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, поэтому, если у кого-то есть лучшее решение, мне было бы интересно

Ответ 7

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.