【发布时间】:2018-01-09 13:57:44
【问题描述】:
在 VCL Forms 程序中,我有一个 Form,它实现了一种处理 windows 消息和更新 Form 上的某些控件的方法,例如:
procedure OnMsgTest (var Msg: TMessage); message WM_CUSTOMTEST;
我使用PostMessage 向此表单发送自定义消息,使用如下代码:
h := FindWindow('TFrmTest', nil);
if IsWindow(h) then begin
PostMessage(h, WM_CUSTOMTEST, 0, 0);
end;
当多次实例化Form时,使用上述代码发送消息,只有一个Form实例更新屏幕上的信息。我希望所有打开和实例化的表单都能接收到消息。
重要提示:PostMessage 可以出现在 Form 进程本身中,也可以来自另一个进程。所以,我相信通过表格的循环是行不通的。
实现我的目标的最佳方法是什么?
【问题讨论】:
-
使用
EnumerateWindows查找所有顶级窗口。检查它们是否有匹配的类名。希望世界上没有其他人使用与您相同的表单名称。 -
一个更简单、更安全的选择是使用
RegisterWindowMessage()和PostMessage(HWND_BROADCAST)。让操作系统为你做枚举,只有感兴趣的窗口会对消息做出反应,其他窗口会忽略它。然后类名无关紧要。但是,由于RegisterWindowMessage是动态的,因此您不能使用message处理程序,因此请让Form 覆盖虚拟WndProc方法。 -
我赞同雷米所说的