Отправка нажатий клавиш для управления в .Net

Мой элемент управления ActiveX содержит различные фигуры, которые нарисованы. CTRL-A используется в элементе управления для выбора всех объектов. Аналогично CTRL-C для копирования, CTRL-V для вставки и т. Д.

Однако когда я вставляю этот элемент управления в форму Windows в приложении .Net, он не получает эти события клавиатуры. Я попытался добавить событие PreviewKey, и это позволяет отправлять определенные нажатия клавиш, например, TAB, но не эти измененные ключи.

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

Спасибо.

13.10.2009 12:50:51
4 ОТВЕТА

Вам нужно перехватить ключи и переопределить метод ProcessCmdKey.

class MyDataGrid : System.Windows.Forms.DataGrid

    {
       protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
       {
           ...........

       }
    }

http://support.microsoft.com/kb/320584

0
13.10.2009 13:13:22

KeyPreview это просто неправильный метод. Попробуйте использовать KeyUp или KeyDown, например так:

        private void ControlKeyTestForm_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.A)
                 this.label1.Text = "Ctrl+A pressed";
        }

Если вы хотите, чтобы содержащаяся форма работала с сочетаниями клавиш, не забудьте установить для свойства KeyPreview формы значение true, а затем установить в форме обработчики KeyDown или KeyUp.

0
20.08.2010 00:48:47

Используйте свойство Control.ModifierKeys для проверки ключей модификаторов.

Например, чтобы проверить наличие клавиши Shift,

попробуйте if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) {}

Полный пример здесь:

http://msdn.microsoft.com/en-us/library/aa984219%28VS.71%29.aspx

0
8.09.2010 19:21:37

Возможно, элемент управления ActiveX не имеет фокуса и поэтому не получает ключевые события. Возможно, вы захотите обработать ключевые события на уровне формы, а затем вызвать соответствующие методы в элементе управления ActiveX. Если вы установите KeyPreviewсвойство вашей формы в trueформе, вы получите ключевые события для всех элементов управления в форме. Таким образом, ваши ярлыки должны работать независимо от того, какой элемент управления в данный момент находится в фокусе. Вот быстрый пример, с которым вы можете поиграть, чтобы проверить это. Создайте новую форму с несколькими различными элементами управления и измените код следующим образом:

public Form1()
{
    InitializeComponent();

    KeyPreview = true;  // indicates that key events for controls on the form
                        // should be registered with the form

    KeyUp += new KeyEventHandler(Form1_KeyUp);
}

void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        switch (e.KeyCode)
        {
            case Keys.A:
                MessageBox.Show("Ctrl + A was pressed!");
                // activeXControl.SelectAll();
                break;
            case Keys.C:
                MessageBox.Show("Ctrl + C was pressed!");
                // activeXControl.Copy();
                break;
            case Keys.V:
                MessageBox.Show("Ctrl + V was pressed!");
                // activeXControl.Paste();
                break;
        }
    }
}

Независимо от того, какой элемент управления находится в фокусе при вводе комбинаций клавиш, Form1_KeyUpметод вашей формы будет вызываться для его обработки.

1
1.10.2010 05:22:56