Событие Fire Form KeyPress - PullRequest
       23

Событие Fire Form KeyPress

6 голосов
/ 31 марта 2011

У меня есть winform C #, на которой у меня есть кнопка 1.
Теперь, когда я запускаю свое приложение, кнопка автоматически фокусируется.

Проблема в том, что KeyPress событие моей формы не работает, потому что кнопка находится в фокусе.

Я пробовал this.Focus(); на FormLoad() событии, но все же событие KeyPress неза работой.

Ответы [ 5 ]

10 голосов
/ 31 марта 2011

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

Пример кода:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // look for the expected key
    if (keyData == Keys.A)
    {
        // take some action
        MessageBox.Show("The A key was pressed");

        // eat the message to prevent it from being passed on
        return true;

        // (alternatively, return FALSE to allow the key event to be passed on)
    }

    // call the base class to handle other key events
    return base.ProcessCmdKey(ref msg, keyData);
}

Что касается того, почему this.Focus() не работает, это потому, что форма сама по себе не может иметь фокус. Конкретный элемент управления должен иметь фокус, поэтому, когда вы устанавливаете фокус на форму, он фактически устанавливает фокус на первый элемент управления, который может принимать фокус с самым низким значением TabIndex. В этом случае это ваша кнопка.

4 голосов
/ 31 марта 2011

Попробуйте установить для свойства KeyPreview формы значение True.

1 голос
/ 07 июня 2012

Установить keyPreview = true в главной форме

0 голосов
/ 19 июля 2013

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

Может быть, кто-то найдет это полезным:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace I2c_Programmer {
    class NoSelectButton : Button{

            public NoSelectButton() {

            SetStyle(ControlStyles.Selectable, false);

        }
    }
}

Зайдите в ваш дизайнер, где кнопка создана, и выключите новую кнопку System ... с вашим новым классом "new NoSelectButton ();"

0 голосов
/ 31 марта 2011

Я бы использовал один из следующих:

  1. Установите для свойства TabIndex кнопки значение 0.

  2. Установите для свойства IsDefault кнопки значение true - так, оно будет срабатывать при нажатии клавиши ENTER .

...