其余的 TMessage 缺少参数在哪里?
Where are the rest of the TMessage missing params?
VCL TMessage
class 提供了 Message
, WParam
和 LParam
成员,但是 window 消息有更多的成员:
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)
中处理我的消息。
Where are the hwnd
, time
, pt
and lPrivate
members?
TMessage
中没有这样的成员。
MSG
is the structure that the Win32 API uses in a message loop to retrieve messages from a message queue, via the GetMessage()
and PeekMessage()
functions, prior to dispatching them to window procedures via DispatchMessage()
. The time
, pt
, and lPrivate
values are not delivered to a window procedure, however a window procedure can retrieve the time
and pt
values via the GetMessageTime()
and GetMessagePos()
函数(无法访问 lPrivate
值)。
TMessage
is the structure that the VCL uses in window procedures that are created by the RTL's MakeObjectInstance()
函数。此函数允许 类,像 VCL 的 TWinControl
和 TTimer
,使用 non-static 虚拟 WndProc()
方法作为 Win32 window 过程。
在 standard Win32 window procedure 中,只有 4 个参数可用 - hWnd
、uMsg
、wParam
和 lParam
。 RTL-based window 过程忽略 hWnd
(因为它已经确切知道要调用哪个对象方法),复制 uMsg
、wParam
和 lParam
值转换为 TMessage
,调用目标 WndProc()
方法将其传递给 TMessage
,然后 returns 将 TMessage::Result
值返回给 OS .
I'm in specially need of the time
parameter. Is there a way to access the original message that TMessage is constructed from (or any other means to get the time parameter)?
如果消息来自调用您的线程的消息队列 WndProc()
,您可以使用 Win32 API GetMessageTime()
function. Or, you can use the Win32 API SetWindowsHookEx()
function to install a WH_GETMESSAGE
挂钩进入线程的消息队列。
如果您的组件的 WndProc()
在主 UI 线程中被调用,您也可以使用 VCL 的 TApplication::OnMessage
or TApplicationEvents::OnMessage
events, which receive a copy of the original MSG
structure. Your component can use a private TApplicationEvents
对象来挂钩 OnMessage
事件。
然而,一个 window 过程可以同时接收 queued messages and non-queued messages,所以如果消息根本不是来自调用线程的消息队列,那么根本就没有 time
(或 pt
) 可用于检索的值,因为 non-queued 消息不通过 MSG
结构开始。
I'm handling my messages in TComponent::WndProc(Winapi::Messages::TMessage &Message).
TComponent
没有 WndProc()
方法。也许您正在考虑 TWinControl::WndProc()
?
VCL TMessage
class 提供了 Message
, WParam
和 LParam
成员,但是 window 消息有更多的成员:
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)
中处理我的消息。
Where are the
hwnd
,time
,pt
andlPrivate
members?
TMessage
中没有这样的成员。
MSG
is the structure that the Win32 API uses in a message loop to retrieve messages from a message queue, via the GetMessage()
and PeekMessage()
functions, prior to dispatching them to window procedures via DispatchMessage()
. The time
, pt
, and lPrivate
values are not delivered to a window procedure, however a window procedure can retrieve the time
and pt
values via the GetMessageTime()
and GetMessagePos()
函数(无法访问 lPrivate
值)。
TMessage
is the structure that the VCL uses in window procedures that are created by the RTL's MakeObjectInstance()
函数。此函数允许 类,像 VCL 的 TWinControl
和 TTimer
,使用 non-static 虚拟 WndProc()
方法作为 Win32 window 过程。
在 standard Win32 window procedure 中,只有 4 个参数可用 - hWnd
、uMsg
、wParam
和 lParam
。 RTL-based window 过程忽略 hWnd
(因为它已经确切知道要调用哪个对象方法),复制 uMsg
、wParam
和 lParam
值转换为 TMessage
,调用目标 WndProc()
方法将其传递给 TMessage
,然后 returns 将 TMessage::Result
值返回给 OS .
I'm in specially need of the
time
parameter. Is there a way to access the original message that TMessage is constructed from (or any other means to get the time parameter)?
如果消息来自调用您的线程的消息队列 WndProc()
,您可以使用 Win32 API GetMessageTime()
function. Or, you can use the Win32 API SetWindowsHookEx()
function to install a WH_GETMESSAGE
挂钩进入线程的消息队列。
如果您的组件的 WndProc()
在主 UI 线程中被调用,您也可以使用 VCL 的 TApplication::OnMessage
or TApplicationEvents::OnMessage
events, which receive a copy of the original MSG
structure. Your component can use a private TApplicationEvents
对象来挂钩 OnMessage
事件。
然而,一个 window 过程可以同时接收 queued messages and non-queued messages,所以如果消息根本不是来自调用线程的消息队列,那么根本就没有 time
(或 pt
) 可用于检索的值,因为 non-queued 消息不通过 MSG
结构开始。
I'm handling my messages in TComponent::WndProc(Winapi::Messages::TMessage &Message).
TComponent
没有 WndProc()
方法。也许您正在考虑 TWinControl::WndProc()
?