Где остальные параметры TMessage отсутствуют?

VCL TMessage класс предоставляет Message, WParam и LParam members, но у оконного сообщения больше участников:

typedef struct tagMSG {
  HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
  DWORD  lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;

Где находятся hwnd, time, pt и lPrivateчлены? Я особенно нуждаюсь в time параметр.

Есть ли способ получить доступ к исходному сообщению, которое TMessage построен из (или любых других средств получения time параметр)?

Я обрабатываю свои сообщения в TComponent::WndProc(Winapi::Messages::TMessage &Message).

1 ответ

Решение

Где hwnd, time, pt и lPrivate члены?

Таких участников нет в TMessage.

MSG- это структура, которую Win32 API использует в цикле сообщений для извлечения сообщений из очереди сообщений через GetMessage() и PeekMessage() функции, перед отправкой их оконным процедурам через DispatchMessage(). В time, pt, и lPrivate значения не доставляются оконной процедуре, однако оконная процедура может получить time и pt значения через GetMessageTime() и GetMessagePos() функции соответственно (lPrivate значение недоступно).

TMessage это структура, которую VCL использует в оконных процедурах, созданных RTL MakeObjectInstance() функция. Эта функция позволяет классам, таким как VCL TWinControl и TTimer, чтобы использовать нестатический виртуальный WndProc() методы как оконные процедуры Win32.

В стандартной оконной процедуре Win32 доступны только 4 параметра: hWnd, uMsg, wParam и lParam. Оконная процедура на основе RTL игнорирует hWnd (поскольку он уже точно знает, какой метод объекта вызывать), копирует uMsg, wParam и lParam ценности в TMessage, вызывает цель WndProc() метод, передав ему TMessage, а затем возвращает TMessage::Result значение обратно в ОС.

Я особенно нуждаюсь в timeпараметр. Есть ли способ получить доступ к исходному сообщению, из которого создается TMessage (или любым другим способом получить параметр времени)?

Если сообщение приходит из очереди сообщений потока, который вызывает ваш WndProc(), вы можете использовать Win32 API GetMessageTime() функция. Или вы можете использовать Win32 API SetWindowsHookEx() функция для установки WH_GETMESSAGE подключиться к очереди сообщений потока.

Если ваш компонент WndProc() вызывается в основном потоке пользовательского интерфейса, в качестве альтернативы вы можете использовать VCL TApplication::OnMessage или же TApplicationEvents::OnMessage события, которые получают копию оригинала MSGструктура. Ваш компонент может использовать частный TApplicationEvents объект зацепить OnMessage событие.

Однако, оконная процедура может получить как в очереди сообщений и не-очереди сообщений, поэтому если сообщение не приходит из очереди сообщений вызывающего потока на всех, то есть просто нет time (или же pt) значение, доступное для его получения, поскольку сообщения, не поставленные в очередь, не проходят через MSG структура для начала.

Я обрабатываю свои сообщения в TComponent::WndProc(Winapi::Messages::TMessage &Message).

TComponent не имеет WndProc()метод. Возможно вы думаете о TWinControl::WndProc() вместо?

Другие вопросы по тегам