18

有了一个类(TObject),我有:

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

在哪里TH_MYMESSAGE = WM_USER + 1

在类构造函数中:

FHwnd := AllocateHWND(HandleMyMessage);

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

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

if Message.Msg <> TH_MYMESSAGE then Exit;这很容易通过添加来纠正HandleMyMessage。我的问题是:为什么会这样?

我最好的猜测是,尽管它有指令,但它AllocateHWND已经HandleMyMessage相当于 a 。有没有正确的方法来实现我所缺少的?DefWndProcmessage

4

1 回答 1

13

嗯,当然可以。AllocateHWnd接受 aTWndMethod作为创建窗口的窗口过程。我猜,这种混乱是由于编译器接受了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;
于 2012-06-06T12:36:07.407 回答