C #, WinForms: Что помешало бы событиям KeyDown цепочки от сфокусированного управления до главной формы? У меня работают только листовые элементы управления KeyDown - PullRequest
2 голосов
/ 15 мая 2010

Насколько я понимаю, при нажатии кнопки клавиатуры должно вызываться событие KeyDown для элемента управления, который имеет фокус. Затем KeyDown для родительского элемента управления, и так далее, пока он не достигнет главной формы. UNLESS - по цепочке один из EventHandlers сделал:

e.SuppressKeyPress = true;
e.Handled = true;

В моем случае события KeyDown никогда не попадают в основную форму. У меня есть форма -> Панель -> кнопка, например.

Панель не предлагает событие KeyDown, , но не должно мешать ей достичь основной формы, верно?

Прямо сейчас, как обходной путь, я установил каждый элемент управления для вызова обработчика событий, который я написал. Я в основном пытаюсь предотвратить закрытие приложения Alt-F4 и минимизировать его.

Ответы [ 3 ]

2 голосов
/ 15 мая 2010

Вы можете использовать фильтр сообщений приложения:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Application.AddMessageFilter(new TestMessageFilter());
            Application.Run(new Form1());
        }
    }

    public class TestMessageFilter : IMessageFilter
    {
        private int WM_SYSKEYDOWN = 0x0104;
        private int F4 = 0x73;

        public bool PreFilterMessage(ref Message i_Message)
        {
            Console.WriteLine("Msg: {0} LParam: {1} WParam: {2}", i_Message.Msg, i_Message.LParam, i_Message.WParam);
            if (i_Message.Msg == WM_SYSKEYDOWN && i_Message.WParam == (IntPtr)F4)
                return (true); // Filter the message
            return (false);
        } // PreFilterMessage()

    } // class TestMessageFilter
}
2 голосов
/ 15 мая 2010

[Изменить]

Если вы хотите перехватить Alt-F4, то нет смысла пытаться на уровне управления, поскольку это нажатие клавиши обрабатывается приложением - см. Как отключить Alt + F4 закрывающую форму?

0 голосов
/ 15 мая 2010

Попробуйте создать наблюдателя для записи ваших событий:

http://ondotnet.com/pub/a/dotnet/2002/04/15/events.html

...