Где остальные параметры 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()
вместо?