2011-01-17 16 views
1

Мне нужно связать Ctrl + Z сочетание клавиш с пользовательской формой action (Undo).Событие KeyDown в форме

Я обрабатываю событие Me.KeyDown, но не получаю его каждый раз, когда нажимаю клавиши. Возможно, это зависит от того, какой активный элемент управления в моей форме.

Как я прочитал из this article мне нужно

Private Sub MyForm_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress 
    e.Handled = True 
    End Sub 

, но даже это событие я не получаю, но при наличии некоторых элементов управления, ориентированные, но не другие.

  • Больше, чем, для TextBoxes Я больше не могу изменять текст;
  • Более того, для TextBoxes есть (Windows?) Undo-Redo по умолчанию механизм, который тоже должен работать.
  • Что делать, чтобы всегда получать событие KeyDown на форме?

ответ

4

Вы можете переопределить ProcessCmdKey для обработки нажатий клавиш на уровне формы.

Смотрите этот вопрос для более подробной информации и примеров: Hotkey (not global) in Windows Forms .NET

+0

для текстовых полей есть механизм (Unix-Redo) Undo-Redo, который тоже должен работать. – serhio

+0

поэтому метод работает, но должен быть отфильтрован для текстовых полей – serhio

0
  1. Звуки для меня, как вы желая global hook в какие клавиши нажаты.

  2. Если вы делаете это так, как вы начали, вам придется обрабатывать событие нажатия клавиши/keydown для каждого элемента управления в форме (или каждой форме).

EDIT

Если вы используете событие KeyPress, смешанный с e.handled = верно, что могли бы получить, где вы хотите быть. Настройка, обрабатываемая в true, должна означать, что форма получает все события вместо отдельных элементов управления. Если вы затем используете событие KeyPress для обработки Ctrl + Z, вы должны иметь возможность запускать свою настраиваемую команду в форме независимо от того, какой контроль имеет фокус (согласно документации).

+0

не является глобальным, но форма конкретной. – serhio

+0

хорошо, проблема в том, что я не думаю, что вы можете без обработки события нажатия клавиш/keydown каждого элемента управления на форме. –

+0

Как насчет различий между 'PreviewKeyDown' и' KeyDown'? – serhio

2

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

public Form1() 
{ 
    InitializeComponent(); 

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

    KeyDown += new KeyEventHandler(Form1_KeyDown); 
} 

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

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

+0

Извините, я просто понял, что ваш пример кода - VB, и я привел вам пример на C#. – jwnace

+0

Почему вы используете * KeyUp *? – serhio

+0

проверено. не работает. – serhio

1

Если в вашей форме есть меню, вы можете создать Undo MenuItem и установить его свойства ярлыка для желаемого сочетания клавиш.

+0

У меня нет меню, но очень хорошее замечание! – serhio

-1
Private Sub form_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     KeyPreview = True 
    End Sub 
+0

вы должны добавить некоторое объяснение в свой ответ. –