Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

«Аналог ключевого слова Delphi 'message' в C#»

Delphi , ОС и Железо , Справочник по сообщениям

В Delphi есть возможность создавать свои собственные сообщения с помощью ключевого слова message. Однако, в C# такого аналога нет. В данной статье мы рассмотрим, как можно создавать свои сообщения в C# и обрабатывать их, не переопределяя метод WndProc().

Создание своего сообщения в C

В C#, для создания своего сообщения можно использовать константу, например, const int MY_MESSAGE = 0x0400;. Но для того, чтобы обработать это сообщение, нужно переопределить метод WndProc() и проверить, совпадает ли Msg переданного в метод сообщения с нашим сообщением.

protected override void WndProc(ref Message m)
{
    if (m.Msg == MY_MESSAGE)
    {
        // Обработка сообщения
    }
    else
    {
        base.WndProc(ref m);
    }
}

Однако, автор вопроса хочет создать свою функцию MyMessage() и вызывать ее при получении сообщения. Для этого можно воспользоваться отражением (.NET reflection) и настраиваемыми атрибутами.

Обработка сообщений с помощью отражения и настраиваемых атрибутов

Для начала, создадим настраиваемый атрибут WinMessageHandler, который будет отмечать методы, обрабатывающие сообщения.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class WinMessageHandler : Attribute
{
    public int Msg { get; set; }
}

Затем, создадим класс WinMessageDispatcher, который будет отвечать за распределение сообщений между соответствующими методами.

public class WinMessageDispatcher
{
    private static Dictionary<int, MethodInfo> _handlers;

    static WinMessageDispatcher()
    {
        _handlers = new Dictionary<int, MethodInfo>();
    }

    public static void RegisterHandler(Type type)
    {
        foreach (var method in type.GetMethods())
        {
            var attr = (WinMessageHandler)Attribute.GetCustomAttribute(method, typeof(WinMessageHandler));
            if (attr != null)
            {
                _handlers[attr.Msg] = method;
            }
        }
    }

    public static void DispatchMessage(ref Message m)
    {
        if (_handlers.TryGetValue(m.Msg, out var method))
        {
            method.Invoke(null, new object[] { m });
        }
    }
}

Теперь, можно создать свой метод для обработки сообщений и отметить его атрибутом WinMessageHandler.

public partial class Form1 : Form
{
    private const int MY_MESSAGE = 0x0400;

    [WinMessageHandler(MY_MESSAGE)]
    private static void MyMessageHandler(ref Message m)
    {
        // Обработка сообщения
    }

    protected override void WndProc(ref Message m)
    {
        WinMessageDispatcher.DispatchMessage(ref m);
        base.WndProc(ref m);
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        WinMessageDispatcher.RegisterHandler(typeof(Form1));
        SendMessage(Handle, MY_MESSAGE, IntPtr.Zero, IntPtr.Zero);
    }
}

При нажатии на кнопку, мы регистрируем методы обработки сообщений и отправляем сообщение с нашим уникальным кодом MY_MESSAGE. При получении сообщения, WinMessageDispatcher вызывает соответствующий метод для его обработки.

Таким образом, мы можем создавать и обрабатывать свои сообщения в C#, не переопределяя метод WndProc().

Создано по материалам из источника по ссылке.

В данной статье описывается, как создавать и обрабатывать собственные сообщения в C# без переопределения метода `WndProc()`. Для этого используется отражение и настраиваемые атрибуты.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по сообщениям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:43:36/0.0054581165313721/1