Форма
Windows message
Прежде всего, Message – это СТРУКТУРА, представляющая в .NET сообщения Windows, те самые, которые адресуются приложению и используются системой как средство уведомления выполняющихся в Windows приложений.
Эта структура используется также для формирования собственных сообщений, которые могут формироваться "в обход системы" и передаваться для последующей их обработки оконным процедурам приложений. Это стандартный интерфейс обмена информацией между приложениями. Важно, чтобы приложение "понимало" смысл происходящего.
Объект – представитель Message structure, может быть создан с использованием метода Create (создать – не означает отправить).
Список членов Message structure:
Члены | Объявление |
---|---|
Свойство HWnd. Get, set. Дескриптор окна (window handle) | public IntPtr HWnd(get; set;) |
Свойство Msg. Get, set. ID сообщения | public int Msg {get; set;} |
Свойство WParam. Get, set. Поле WParam сообщения. Значение этого поля зависит от конкретного сообщения. Поле WParam обычно используется для фиксирования небольших фрагментов информации, например, значений флагов | public IntPtr WParam {get; set;} |
Свойство LParam property. Get, set. Поле LParam зависит от типа сообщения. Значением поля может быть ссылка на объект ( object ) | public IntPtr Lparam {get; set;} |
Свойство Result. Специфицирует значение, которое возвращает Windows после перехвата сообщения | public IntPtr Result {get; set;} |
Метод Create. Создает новое сообщение — представитель структуры Message |
public static Message Create ( IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam); |
operator ==. Сравнивает два сообщения на предмет определения их идентичности |
public static Boolean operator ==( Message left, Message right); |
operator !=. Сравнивает два сообщения на предмет определения их различия |
public static Boolean operator !=( Message left, Message righ); |
Метод Equals. Сравнивает два сообщения для определения их эквивалентности |
public override bool Equals(object o) |
Метод GetHashCode. Вычисляет hash код дескриптора (handle) сообщения |
public override int GetHashCode(); |
При этом IntPtr – это platform-specific тип, который используется для представления указателей или дескрипторов. Предназначен для представления целочисленных величин, размеры которых зависят от характеристик платформы ( is platform-specific ). То есть ожидается, что объект этого типа будет иметь размер 32 бита на 32-разрядных аппаратных средствах и операционных системах, и 64 бита — на аппаратных средствах на 64 бита и операционных системах.
Тип IntPtr может использоваться языками, которые поддерживают механизм указателей, и как общее средство для обращения к данным между языками, которые поддерживают и не поддерживают указатели.
Объект IntPtr может быть также использован для поддержки дескрипторов.
Например, объекты IntPtr используются в классе System.IO.FileStream для работы с дескрипторами файлов.
Существует еще один экзотический тип – UIntPtr, который, в отличие от IntPtr, не является CLS-compliant типом.
Только IntPtr -тип используется в common language runtime.
UIntPtr тип разработан в основном для поддержки архитектурной симметрии (to maintain architectural symmetry) с IntPtr -типом.
Примеры перехвата сообщений
В данном приложении очередь сообщений запускается без использования дополнительных классов. Выполняется в режиме отладки. Причина, по которой приложение не реагирует на сообщения системы при запуске в обычном режиме, в настоящее время мне не известна.
using System; using System.Windows.Forms; namespace MessageLoop01 { // A message filter. public class MyMessageFilter : IMessageFilter { long nMess = 0; public bool PreFilterMessage(ref Message m) { nMess++; Console.WriteLine ("Processing the messages:{0}–{1}:{2}",m.Msg,nMess,Application.MessageLoop); return false; } } // Summary description for Class1. class Class1 { // The main entry Point for the application. static void Main(string[] args) { Application.AddMessageFilter(new MyMessageFilter()); Application.Run(); } } }Листинг 16.6.
В следующем примере объект – представитель класса Form связан с оконной процедурой, в рамках которой и запускается цикл обработки сообщений. Замечательное сочетание консольного приложения с окном формы.
using System; using System.Windows.Forms; namespace MessageLoop01 { // A message filter. public class MyMessageFilter : IMessageFilter { long nMess = 0; public bool PreFilterMessage(ref Message m) { nMess++; Console.WriteLine ("Processing the messages:{0}–{1}:{2}>{3}", m.Msg,m.LParam,m.WParam,nMess); return false; } } class MyForm:Form { public MyForm() { if (Application.MessageLoop) Console.WriteLine("Yes!"); else Console.WriteLine("No!"); Application.AddMessageFilter(new MyMessageFilter()); } } // Summary description for Class1. class Class1 { // The main entry Point for the application. static void Main(string[] args) { if (Application.MessageLoop) Console.WriteLine("Yes!"); else Console.WriteLine("No!"); Application.Run(new MyForm()); } } }Листинг 16.7.