winapi - 其余的 TMessage 缺少参数在哪里?
问题描述
VCLTMessage
类提供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 在消息循环中使用的结构,用于通过和函数从消息队列中检索消息,然后通过. 、和值不会传递给窗口过程,但是窗口过程可以分别通过 和 函数检索和值(该值不可访问)。GetMessage()
PeekMessage()
DispatchMessage()
time
pt
lPrivate
time
pt
GetMessageTime()
GetMessagePos()
lPrivate
TMessage
是 VCL 在由 RTLMakeObjectInstance()
函数创建的窗口过程中使用的结构。此函数允许类,如 VCL 的TWinControl
和TTimer
,使用非静态虚拟WndProc()
方法作为 Win32 窗口过程。
在标准的 Win32 窗口过程中,只有 4 个参数可用 - hWnd
、uMsg
和。基于 RTL 的窗口过程会忽略(因为它已经确切知道要调用哪个对象方法),将 和 值复制到a中,调用传递给它的目标方法,然后将值返回给操作系统。wParam
lParam
hWnd
uMsg
wParam
lParam
TMessage
WndProc()
TMessage
TMessage::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()
代替?
推荐阅读
- docker - 用于自动执行时移备份和 azuracast 更新的脚本
- google-chrome - Selenium WebDriver Java Chrome - 如何选择现有配置文件并自动选择个人证书?
- c - 你如何构造一个 C makefile 以便它编译 source.c 文件?
- google-cloud-platform - 无法连接到 GCP VM 权限被拒绝(公钥)错误
- python - 如何在 python 字典中增加一个值?
- css - 使 flex-item 填满居中对齐的 flexbox 的整个实际宽度
- arrays - 在 TypeScript 中格式化数据库中的数据
- python - Widnows 10 上的“无法打开包含文件:'gsl/gsl_errno.h':没有这样的文件或目录”错误
- ruby-on-rails - 如何验证 HSTS 在 Rails 应用程序中是否按预期工作?
- python - .ppm 文件每 3 个像素分隔一次