Не удается обнаружить сочетание клавиш Ctrl + Key для событий нажатия клавиш, когда есть текстовое поле только для чтения с фокусом - PullRequest
12 голосов
/ 04 января 2011

Я думал, что решил эту проблему сам, но он вернулся, чтобы преследовать мое приложение, так что вот так:

У меня есть следующий обработчик события keydown, зарегистрированный в форме с парой отключенных и доступных только для чтения текстовых полей, и они являются всего лишь простыми сочетаниями клавиш:

private void AccountViewForm_KeyDown(object sender, KeyEventArgs e)
{
    //e.SuppressKeyPress = true;
    //e.Handled = true;
    if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.E && !isInEditMode)
        btnEditMode_Click(sender, e);
    if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S && isInEditMode) btnEditMode_Click(sender, e);
    if (e.KeyCode == Keys.Escape) btnCancel_Click(sender, e);
    if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.W) Close();
}

для формы KeyPreview установлено значение true, но всякий раз, когда текстовое поле только для чтения имеет фокус и я нажимаю Ctrl + E, я не могу получить «Control.ModifierKeys == Keys.Control» и «e.KeyCode == Keys.E» для быть правдой одновременно Что действительно странно, так это то, что Ctrl + W работает. У кого-нибудь есть идеи, что, черт возьми, происходит? (

Ответы [ 2 ]

21 голосов
/ 04 января 2011

Согласно этому вопросу и этому , похоже, что более общий способ обработки сочетаний клавиш заключается в переопределении метода ProcessCmdKey ():

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    MessageBox.Show("What the Ctrl+F?");
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

Рассматривали ли вы использование Alt + E и Alt + S и просто установку свойства мнемоники для кнопок? Мне кажется, это хорошо работает, и его проще настроить.

0 голосов
/ 26 ноября 2018

У меня была такая же проблема

В моем приложении ярлыки не работали, если форма открывалась с вызовом show (). Они работали, если форма открывалась с помощью ShowDialog (). Я также обнаружил, что событие keydown для текстового поля не было вызвано CTRL + C и т. Д., Но странным образом было вызвано CTRL + B.

Обходное решение, связанное с использованием события keyup вместо keydown.

Вот мой код:

public void  ShortCut(object sender, KeyEventArgs e, TextBox  box   )
    {
        string s, tmp1, tmp2;
        int selectionIndex;
        switch (e.KeyCode)
        {
            case Keys.V: // paste 
                if (Clipboard.ContainsText())
                {
                    s = Clipboard.GetText(TextDataFormat.Text);
                    selectionIndex = box.SelectionStart;
                    tmp1 = box.Text.Substring(0, selectionIndex);
                    tmp2 = box.Text.Substring(selectionIndex + box.SelectionLength);
                    box.Text = tmp1 + s + tmp2;
                }

                break;
            case Keys.C: // copy 
                if (box.SelectionLength > 0)
                {
                    selectionIndex = box.SelectionStart;
                    s = box.Text.Substring(selectionIndex, box.SelectionLength);
                    Clipboard.SetText(s);
                }
                break;
            case Keys.X: // cut 
                if (box.SelectionLength > 0)
                {
                    selectionIndex = box.SelectionStart;
                    s = box.Text.Substring(selectionIndex, box.SelectionLength);
                    Clipboard.SetText(s);
                    tmp1 = box.Text.Substring(0, selectionIndex);
                    tmp2 = box.Text.Substring(selectionIndex + box.SelectionLength);
                    box.Text = tmp1 + tmp2;
                }


                break;
            case Keys.A: // all 
                box.SelectAll();
                break;

        }

    }

// и вот пример, вызывающий его:

 private void textBoxExpression_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Control)
        {
            m_Host.ShortCut(sender, e, textBoxExpression);


        }
        else
        {

               ....

        }


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