2009-10-13 5 views
3

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

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

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

Спасибо.

ответ

0

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

class MyDataGrid : System.Windows.Forms.DataGrid 

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

     } 
    } 

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

0

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 на форме истинные затем установите KeyDown или KeyUp обработчик в форме.

1

Возможно, элемент управления 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 метод вашей формы будет называться, чтобы справиться с этим.

Смежные вопросы