delphi – 特定表单的所有实例的PostMessage(ClassName):
发布时间:2020-12-15 04:14:34 所属栏目:大数据 来源:网络整理
导读:在VCL Forms程序中,我有一个Form,它实现了一种处理 Windows消息和更新Form上某些控件的方法,如: procedure OnMsgTest (var Msg: TMessage); message WM_CUSTOMTEST; 我使用PostMessage向此表单添加自定义消息,使用如下代码: h := FindWindow('TFrmTest',ni
在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); end; 当Form实例化多次时,使用上面的代码发送消息,只有一个Form实例更新屏幕上的信息.我希望所有打开和实例化的表单都能收到消息. 一个重要的注意事项:PostMessage可以在Form进程本身内发生,也可以从另一个进程发生.所以,我认为通过Forms的循环不起作用. 达到目标的最佳方法是什么? 解决方法
您必须枚举所有正在运行的顶级窗口,将消息分别发布到每个匹配的窗口.您可以使用EnumWindows()或FindWindow / Ex()循环,但更简单的解决方案是使用PostMessage(HWND_BROADCAST)来广播使用RegisterWindowMessage()注册的消息.只有处理已注册消息的窗口才会对它做出反应,其他窗口只会忽略它.例如:
type TMyForm = class(TForm) protected procedure WndProc(var Msg: TMessage); override; end; ... var WM_CUSTOMTEST: UINT = 0; procedure TMyForm.WndProc(var Msg: TMessage); begin if (Msg.Msg = WM_CUSTOMTEST) and (WM_CUSTOMTEST <> 0) then begin ... end else inherited; end; initialization WM_CUSTOMTEST := RegisterWindowMessage('SomeUniqueNameHere'); 然后你可以在需要时这样做: if WM_CUSTOMTEST <> 0 then PostMessage(HWND_BROADCAST,0); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |