gpt4 book ai didi

delphi - 特定表单(ClassName)的所有实例的 PostMessage :

转载 作者:行者123 更新时间:2023-12-03 15:07:23 25 4
gpt4 key购买 nike

在 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 可以发生在表单进程本身内,也可以发生在另一个进程中。因此,我认为循环遍历表单是行不通的。

实现我的目标的最佳方法是什么?

最佳答案

您必须枚举所有正在运行的顶级窗口,将消息分别发布到每个匹配的窗口。您可以使用 EnumWindows()FindWindow/Ex() 循环来实现此目的,但更简单的解决方案是使用 PostMessage(HWND_BROADCAST)广播使用 RegisterWindowMessage() 注册的消息。只有处理注册消息的窗 Eloquent 会对其使用react,其他窗口只会忽略它。例如:

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, WM_CUSTOMTEST, 0, 0);

关于delphi - 特定表单(ClassName)的所有实例的 PostMessage :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48169800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com