1

VCLTMessage类提供Message,WParamLParam成员,但窗口消息有更多成员:

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

hwndtimept成员在哪里lPrivate?我特别需要这个time参数。

有没有办法访问TMessage由(或任何其他获取time参数的方法)构造的原始消息?

我正在处理我的消息TComponent::WndProc(Winapi::Messages::TMessage &Message)

4

1 回答 1

3

hwndtimept成员在哪里lPrivate

中没有这样的成员TMessage

MSG是 Win32 API 在消息循环中使用的结构,用于通过和函数从消息队列中检索消息,然后通过. 、和值不会传递给窗口过程,但是窗口过程可以分别通过 和 函数检索和值(该值不可访问)。GetMessage()PeekMessage()DispatchMessage()timeptlPrivatetimeptGetMessageTime()GetMessagePos()lPrivate

TMessage是 VCL 在由 RTLMakeObjectInstance()函数创建的窗口过程中使用的结构。此函数允许类,如 VCL 的TWinControlTTimer,使用非静态虚拟WndProc()方法作为 Win32 窗口过程。

标准的 Win32 窗口过程中,只有 4 个参数可用 - hWnduMsg和。基于 RTL 的窗口过程会忽略(因为它已经确切知道要调用哪个对象方法),将 和 值复制到a中,调用传递给它的目标方法,然后将值返回给操作系统。wParamlParamhWnduMsgwParamlParamTMessageWndProc()TMessageTMessage::Result

我特别需要这个time参数。有没有办法访问构造 TMessage 的原始消息(或任何其他获取时间参数的方法)?

如果消息来自调用你的线程的消息队列WndProc(),你可以使用 Win32 APIGetMessageTime()函数。或者,您可以使用 Win32 APISetWindowsHookEx()函数将WH_GETMESSAGE挂钩安装到线程的消息队列中。

如果您的组件WndProc()在主 UI 线程中被专门调用,您可以选择使用 VCLTApplication::OnMessage或事件,它们接收原始结构TApplicationEvents::OnMessage的副本。MSG您的组件可以使用私有TApplicationEvents对象来挂钩OnMessage事件。

但是,窗口过程可以接收排队消息非排队消息,因此如果消息根本不是来自调用线程的消息队列,那么根本没有time(或pt)值可用于检索它,因为非排队的消息一开始不会通过MSG结构。

我在 TComponent::WndProc(Winapi::Messages::TMessage &Message) 中处理我的消息。

TComponent没有WndProc()方法。也许你正在考虑TWinControl::WndProc()代替?

于 2020-10-24T01:00:12.733 回答