问题描述
VCL TMessage
类提供了Message
,WParam
和LParam
成员,但是窗口消息中有更多成员:
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)
中的消息。
解决方法
hwnd
,time
,pt
和lPrivate
成员在哪里?
TMessage
中没有这样的成员。
MSG
是Win32 API在message loop中用来通过message queue和GetMessage()
函数从PeekMessage()
检索消息的结构,通过window procedures将它们分发到DispatchMessage()
。 time
,pt
和lPrivate
的值未传递到窗口过程,但是窗口过程可以通过{来检索time
和pt
值{3}}和GetMessageTime()
函数(lPrivate
值不可访问)。
GetMessagePos()
是VCL在由RTL的TMessage
函数创建的窗口过程中使用的结构。此功能允许类(例如VCL的TWinControl
和TTimer
)使用非静态虚拟WndProc()
方法作为Win32窗口过程。
在MakeObjectInstance()
中,只有4个参数可用-hWnd
,uMsg
,wParam
和lParam
。基于RTL的窗口过程忽略hWnd
(因为它已经确切知道要调用哪个对象方法),将uMsg
,wParam
和lParam
的值复制到{{ 1}},调用目标TMessage
方法并将其传递给WndProc()
,然后将TMessage
值返回给操作系统。
我特别需要
TMessage::Result
参数。是否可以访问构造TMessage的原始消息(或任何其他获取时间参数的方法)?
如果消息来自正在调用time
的线程的消息队列,则可以使用Win32 API standard Win32 window procedure函数。或者,您可以使用Win32 API GetMessageTime()
函数将SetWindowsHookEx()
挂钩安装到线程的消息队列中。
如果专门在主UI线程中调用了组件的WndProc()
,则可以选择使用VCL的WH_GETMESSAGE
或TApplication::OnMessage
事件,该事件接收原始{{1}的副本} 结构体。您的组件可以使用私有的TApplicationEvents::OnMessage
对象来挂起WndProc()
事件。
但是,窗口过程可以同时接收TApplicationEvents
和queued messages,因此,如果消息根本不是来自调用线程的消息队列,则根本没有MSG
(或OnMessage
)值可用于为其检索,因为未排队的消息首先不会经过time
结构。
我正在TComponent :: WndProc(Winapi :: Messages :: TMessage&Message)中处理消息。
pt
没有MSG
方法。也许您正在考虑使用non-queued messages?