Отправить KeyEvent из формы в элемент управления - PullRequest
0 голосов
/ 18 июня 2009

У меня есть приложение Windows.Worms. В одной из моих форм я отображаю DataGridView с привязанным к нему ContextMenu (не ContextMenuStrip). Для элементов MenuItem в ContextMenu определены ярлыки.

Вот как создается ContextMenu:

    Private _contextMenu As _
        New ContextMenu( _
            New MenuItem() { _
                New MenuItem("Item A", AddressOf ItemA_Click, Shortcut.CtrlA) With {.DefaultItem = True}, _
                New MenuItem("Item B", AddressOf ItemB_Click, Shortcut.CtrlB), _
                New MenuItem("Item C", AddressOf ItemC_Click, Shortcut.CtrlC), _
                ...
            }) _
        With {.Name = "MyContextMenu"}

Если мой DataGridView имеет фокус и я нажимаю Ctrl + A вызывается ItemA_Click.
Теперь я хочу, чтобы Ярлык работал для всей моей формы, даже если у DataGridView нет фокуса.
Обратный путь будет легким, мне просто нужно установить KeyPreview формы на true. Но я хочу передать событие в мой DataGridView.

Я пытался вызвать методы OnKeyDown и OnKeyPress из DataGridView, но оба они не работают. Я не знаю этого, но я предполагаю, что ContextMenu игнорирует события Key ... и подключается к очереди сообщений, но я не знаю, как преобразовать мой System.Windows.Forms.KeyEventArgs в сообщения Windows .

Только двое думают:
- Сфокусируй DataGridView и используй SendKeys как решение только над моим мертвым телом.
- Я не могу извлечь логику из ContextMenu и использовать KeyPreview или что-то в этом роде. как это.

1 Ответ

1 голос
/ 18 июня 2009

Я думаю, что вы почти поняли - попробуйте установить для KeyPreview формы значение true, а затем сами поймаете комбинацию клавиш. Когда вы поймаете нажатие сочетания клавиш, вызовите соответствующий метод: (Извините, это C #, так как я больше знаком с синтаксисом C # ...)

private void Form_KeyDown(object sender, KeyEventArgs e) { 
   if (e.Control && e.KeyCode == Keys.A) {
      ItemA_Click(...);
   } else if (e.Control && e.KeyCode == Keys.B) { 
      ItemB_Click(...);
   } else if (e.Control && e.KeyCode == Keys.C) { 
      ItemC_Click(...);
   }
}
...