【发布时间】:2012-06-10 10:53:29
【问题描述】:
我有一个类(TObject):
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;
在哪里TH_MYMESSAGE = WM_USER + 1
在类构造函数中:
FHwnd := AllocateHWND(HandleMyMessage);
接收对FHwnd 的引用的唯一对象是私有自定义TThread(在此类中创建),它发布的唯一消息是TH_MYMESSAGE。我的理解是过程声明中的message 指令将其处理限制为仅TH_MYMESSAGE。
这在测试中运行良好,但在集成到更大的应用程序后,我收到反馈,HandleMyMessage 也正在触发其他消息(具有明显的不良结果)。
这很容易通过在HandleMyMessage 中添加if Message.Msg <> TH_MYMESSAGE then Exit; 来纠正。我的问题是:为什么会这样?
我最好的猜测是 AllocateHWND 使 HandleMyMessage 等同于 DefWndProc 尽管它具有 message 指令。有没有正确的方法来实现我所缺少的?
【问题讨论】:
-
你的猜测是正确的
HandleMyMessage变成WndProc创建的非可视窗口。所以它接收所有消息;您过滤Message.Msg的解决方案也是正确的。messageDelphi 用于默认处理TObject.Dispatch调用的方法修改器(在非窗口类中) -
@teran 那么假设我确实想要一个默认的
WndProc用于其他消息,如果我在其他一些常规过程中完成了AllocateHWND,那么HandleMyMessage将使用message指令正确过滤? -
@Ken 这里的 WM_USER 没问题。
标签: multithreading delphi message delphi-xe2 hwnd