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

问题描述

VCL TMessage类提供了MessageWParamLParam成员,但是窗口消息中有更多成员:

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)中的消息。

解决方法

hwndtimeptlPrivate成员在哪里?

TMessage中没有这样的成员。

MSG是Win32 API在message loop中用来通过message queueGetMessage()函数从PeekMessage()检索消息的结构,通过window procedures将它们分发到DispatchMessage()timeptlPrivate的值未传递到窗口过程,但是窗口过程可以通过{来检索timept值{3}}和GetMessageTime()函数(lPrivate值不可访问)。

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

MakeObjectInstance()中,只有4个参数可用-hWnduMsgwParamlParam。基于RTL的窗口过程忽略hWnd(因为它已经确切知道要调用哪个对象方法),将uMsgwParamlParam的值复制到{{ 1}},调用目标TMessage方法并将其传递给WndProc(),然后将TMessage值返回给操作系统。

我特别需要TMessage::Result参数。是否可以访问构造TMessage的原始消息(或任何其他获取时间参数的方法)?

如果消息来自正在调用time的线程的消息队列,则可以使用Win32 API standard Win32 window procedure函数。或者,您可以使用Win32 API GetMessageTime()函数将SetWindowsHookEx()挂钩安装到线程的消息队列中。

如果专门在主UI线程中调用了组件的WndProc(),则可以选择使用VCL的WH_GETMESSAGETApplication::OnMessage事件,该事件接收原始{{1}的副本} 结构体。您的组件可以使用私有的TApplicationEvents::OnMessage对象来挂起WndProc()事件。

但是,窗口过程可以同时接收TApplicationEventsqueued messages,因此,如果消息根本不是来自调用线程的消息队列,则根本没有MSG(或OnMessage)值可用于为其检索,因为未排队的消息首先不会经过time结构。

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

pt没有MSG方法。也许您正在考虑使用non-queued messages

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...