J..*_*... 19 delphi multithreading message hwnd delphi-xe2
我有一个类(TObject):
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;
Run Code Online (Sandbox Code Playgroud)
哪里 TH_MYMESSAGE = WM_USER + 1
在类构造函数中:
FHwnd := AllocateHWND(HandleMyMessage);
Run Code Online (Sandbox Code Playgroud)
接收引用的唯一对象FHwnd是私有自定义TThread(在此类中创建)以及它发布的唯一消息TH_MYMESSAGE.我的理解是,message程序声明中的指令仅限制其处理TH_MYMESSAGE.
这在测试中运行良好,但是在集成到更大的应用程序中时,我得到的反馈HandleMyMessage也会触发其他消息(显然有不希望的结果).
这可以通过添加if Message.Msg <> TH_MYMESSAGE then Exit;来轻松纠正HandleMyMessage.我的问题是:为什么会这样?
我最好的猜测是,AllocateHWND已经取得HandleMyMessage的等效DefWndProc尽管拥有它message的指令.有没有正确的方法来实现我缺少的?
Ser*_*yuz 13
嗯,当然可以.AllocateHWnd接受a 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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)