C# пользовательское поведение клавиши ВВОД

У меня есть небольшой проект, в котором я хочу, чтобы несколько кнопок вели себя по-разному при нажатии или Ctrl+ щелчок. Чтобы достичь этого, каждая из этих кнопок имеет функцию такого рода, прикрепленную к их событию Click():

private void Button1_Click(object sender, EventArgs e)
    {
        int value = 10 //default value
        bool boool = false; 
        if (ModifierKeys == Keys.Control)
        {
            using (var form = new NUP_Popup(0, value, value, "maximum ?")) 
            { //creates a simple window that allows user to change the value of 'value'
                form.ShowDialog();
                if (form.DialogResult == DialogResult.OK)
                {
                    value = form.retVal;
                    boool = true;
                }
                else return;
            }
        }
        //do stuff here, either with default or user value
    }

Теперь клики или Ctrl+ клики ведут себя так, как задумано с этой функцией. Моя проблема в том, что это поведение не применяется, когда мои кнопки активируются с помощью клавиши Enter: одна клавиша Enter запускает "нормальное" поведение, но Ctrl+Enter ничего не делает (кнопка не активируется).

Я уже переопределил функцию ProcessDialogKey(), чтобы закрыть окно при нажатии клавиши Escape, поэтому я подумал, что мог бы использовать ее, чтобы нажатия клавиш Enter вызывали функцию события Click():

protected override bool ProcessDialogKey(Keys keyData)  //Allows quit when Esc is pressed
    {
        if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }
        if (keyData == Keys.Return)
        {
            this.OnClick(new EventArgs());
        }
        return base.ProcessDialogKey(keyData);
    }

И вот где я застрял. Конечно, это ничего не делает, но я не знаю, что набирать в моем втором условии, чтобы оно работало.

Может я использую неправильный подход? Может ли кто-нибудь указать мне правильное направление, чтобы сделать это?

3 ответа

Я нашел решение, которое позволяет вам либо нажать Enter, либо Ctrl+Enter:

private void txtIP_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\n' || e.KeyChar == '\r') btnStart_Click(sender, new EventArgs());
        }

Предполагая, что вы поместили ярлык с идентификатором Label1 и кнопку с идентификатором Button1, выполните следующее:

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Button Clicked";
        if (Control.ModifierKeys == Keys.Control) label1.Text += " with Ctrl";
    }

    private void button1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == '\n') button1_Click(sender, new EventArgs());
    }

к вашему решению просто добавьте событие KeyPress к вашему Button1 и примените следующий код внутри события нажатия клавиши Button1_KeyPress:

if (e.KeyChar == '\n') Button1_Click(sender, new EventArgs());

Итак, я наконец нашел рабочее решение, добавив это в мой переопределенный метод ProcessDialogKey():

if (keyData == (Keys.Enter | Keys.Control))
        {
            (this.ActiveControl as Button).PerformClick();
        }

Я не знаю, квалифицируется ли он как "чистый" код, но имеет смысл выполнить 2 моих требования: сделать Ctrl+Enter в качестве Ctrl+Click без необходимости объявлять 2 метода на кнопку.

Другие вопросы по тегам