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