其余的 TMessage 缺少参数在哪里?

Where are the rest of the TMessage missing params?

VCL TMessage class 提供了 Message, WParamLParam 成员,但是 window 消息有更多的成员:

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

hwndtimeptlPrivate 成员在哪里?我特别需要 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 的 TWinControlTTimer,使用 non-static 虚拟 WndProc() 方法作为 Win32 window 过程。

standard Win32 window procedure 中,只有 4 个参数可用 - hWnduMsgwParamlParam。 RTL-based window 过程忽略 hWnd(因为它已经确切知道要调用哪个对象方法),复制 uMsgwParamlParam 值转换为 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()