gpt4 book ai didi

multithreading - 非窗口类中的自定义消息 - 需要默认处理程序吗?

转载 作者:行者123 更新时间:2023-12-03 14:35:16 24 4
gpt4 key购买 nike

对于一个类(TObject)我有:

private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;

哪里TH_MYMESSAGE = WM_USER + 1

在类构造函数中:

FHwnd := AllocateHWND(HandleMyMessage);

唯一接收FHwnd引用的对象是一个私有(private)自定义 TThread(在此类中创建),它发布的唯一消息是 TH_MYMESSAGE 。我的理解是message过程声明中的指令将其处理限制为仅 TH_MYMESSAGE .

这在测试中运行良好,但在集成到更大的应用程序中后,我得到的反馈是 HandleMyMessage也正在触发其他消息(明显不期望的结果)。

通过添加 if Message.Msg <> TH_MYMESSAGE then Exit; 可以轻松纠正此问题在HandleMyMessage 。我的问题是:为什么会发生这种情况?

我最好的猜测是AllocateHWND已取得HandleMyMessage相当于 DefWndProc尽管它有 message指示。有没有正确的方法来实现我所缺少的?

最佳答案

嗯,当然可以。 AllocateHWnd 接受 TWndMethod 作为所创建窗口的窗口过程。我猜想,这种困惑是由编译器接受 messsage 指令引起的。不要放它:

private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage);

..

procedure TMyClass.HandleMyMessage(var Message: TMessage);
begin
case Message.Msg of
TH_MYMESSAGE: //
end;
Message.Result := DefWindowProc(FHWnd, Message.Msg, Message.WParam, Message.LParam);
end;

<小时/> 编辑:(对评论的回复)。要在创建实用程序窗口的类上处理消息,您可以将消息从 AllocateHWnd 创建的窗口路由到您的类:

private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage);
procedure THMyMessage(var Message: TMessage); message TH_MYMESSAGE;

..

procedure TMyClass.HandleMyMessage(var Message: TMessage);
begin
case Message.Msg of
TH_MYMESSAGE: Dispatch(Message);
end;
Message.Result := DefWindowProc(FHWnd, Message.Msg, Message.WParam, Message.LParam);
end;

procedure TMyClass.THMyMessage(var Message: TMessage);
begin
//
end;

关于multithreading - 非窗口类中的自定义消息 - 需要默认处理程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913961/

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