Как передать ключевые события от элемента управления до формы? - PullRequest
2 голосов
/ 17 февраля 2010

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

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

В качестве теста я поместил TextBox на форму. После ввода в TextBox он должен вести себя по умолчанию при нажатии определенных клавиш. Ctrl-S, F1 и т. Д. Я хочу, чтобы они проходили через TextBox до формы, которая будет обрабатываться на более высоком уровне. Это те команды, которые TextBox не выполняет по умолчанию.

Мне нужны события, чтобы сначала пройти через TextBox. Приложение, в котором требуется эта функциональность, является более сложным, чем этот простой пример. Например, когда TextBox является сфокусированным элементом управления, он должен выполнять копирование и вставку по умолчанию, используя Ctrl-C и Ctrl-V. Однако, когда сосредоточены различные другие элементы управления, эти команды должны оказаться на самом верхнем уровне формы для обработки там.

Edit: Похоже, что входные события переходят от формы к сфокусированному контролю, а не наоборот, как я ожидал. Если бы он перешел от Фокуса к Форме, у меня, вероятно, не было бы проблемы, с которой я столкнулся.

Edit2: Прочитав (кратко) эту статью: http://www.codeproject.com/KB/WPF/BeginWPF3.aspx Теперь я предполагаю, что тот «пузырек», который я ожидал просто «быть там», доступен только в WPF, а не в стандартном C #. Я думаю, что мне придется переосмыслить способ взаимодействия пользователей с моим приложением, а не писать множество уродливого кода.

Большие очки всем, кто может ответить на вопрос о создании пузырей в стиле WPF в C # без уродливого кода.

Ответы [ 4 ]

2 голосов
/ 18 февраля 2010

Вы по-прежнему можете использовать свойство KeyPreview, но проверьте, какой элемент управления сфокусирован, если это текстовое поле, тогда ничего не делайте, в противном случае, если это другой элемент управления, скажем RichTextBox, затем обработайте нажатые клавиши. Чтобы получить текущий элемент управления, вам может понадобиться доступ к Win32 API. Пример: создайте новое приложение для форм Windows, добавьте в форму текстовое поле и поле richtext, установите для свойства KeyPreview формы значение true, добавьте обработчик события для события KeyDown формы, текстового поля и richtextbox. Также следующий оператор использования:

using System.Runtime.InteropServices;//for DllImport

затем замените код формы следующим кодом:

public partial class Form1 : Form
{
    // Import GetFocus() from user32.dll
    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
    internal static extern IntPtr GetFocus();

    protected Control GetFocusControl()
    {
        Control focusControl = null;
        IntPtr focusHandle = GetFocus();
        if (focusHandle != IntPtr.Zero)
            // returns null if handle is not to a .NET control
            focusControl = Control.FromHandle(focusHandle);
        return focusControl;
    } 

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        Control focusedControl = GetFocusControl();
        if (focusedControl != null && !(focusedControl is TextBox) && e.Control && e.KeyCode == Keys.C)//not a textbox and Copy
        {
            MessageBox.Show("@Form");
            e.Handled = true;
        }
    }

    private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.Control && e.KeyCode == Keys.C)
            MessageBox.Show("@Control");
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.C)
            MessageBox.Show("@Control");
    }
}
0 голосов
/ 17 февраля 2010

К сожалению, вам нужно реализовать это вручную - внедрить обработчик событий KeyDown в своей форме, проверить комбинации глобальных клавиш и установить для них KeyPressEventArgs.Handled = true.

Для справки: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx

0 голосов
/ 17 февраля 2010

Вы можете реализовать обработчик событий для событий KeyPress и / или KeyUp / KeyDown текстового поля.

В вашем обработчике события KeyPress, если для свойства Handled для события установлено значение true, тогда событие не будет передано в текстовое поле.Если вы не установите его на true, это будет.

(отредактировано для пояснения второго абзаца).

0 голосов
/ 17 февраля 2010

Проверьте ссылку, приведенную ниже.

http://www.vbdotnetforums.com/windows-forms/30257-solved-ctrl-s-combobox.html

Надеюсь, это поможет.

С уважением, Радж

...