Delphi - 替换控件WindowProc并调度消息

时间:2015-02-26 10:40:05

标签: windows delphi delphi-xe2 windows-messages

Way of getting control handle from TMessage问题开始,我已经创建了自己的实现,以便用我自己的实现替换Windowproc,以便在按下鼠标左键时进行一些处理。

  TOverrideMessage = class
  public
    FControl: TWinControl;
    FOldWndProc: TWndMethod;
    procedure OverrideWindowProc(var Message: TMessage);
  end;

实现:

procedure TOverrideMessage.OverrideWindowProc(var Message: TMessage);
begin
  if Message.Msg = WM_NCLBUTTONDOWN then
    begin
      FOldWndProc(Message);
      if FControl is TSomeCustomControl then
        ShowMessage(TSomeCustomControl(FControl).Caption);//this property exists
    end
  else
   Dispatch(Message);
end;

用我的类实例替换我想要的每个控件的windowproc:

  LOverrideMessage := TOverrideMessage.Create;
  LOverrideMessage.FControl := TSomeCustomControl(lControl4);
  LOverrideMessage.FOldWndProc := TWinControl(lControl4).WindowProc;
  TWinControl(lControl4).WindowProc := LOverrideMessage.OverrideWindowProc;

我遇到的问题是消息没有正确地进一步分配给控件,因此控件没有正确绘制等。另外,我没有在类实现中收到WM_NCLBUTTONDOWN消息。怎么了?

1 个答案:

答案 0 :(得分:4)

您的主要问题是未能拨打FOldWndProc。你需要调用它而不是Dispatch。当您致电Dispatch时,您将获得基本TObject处理,但不执行任何操作。

procedure TOverrideMessage.OverrideWindowProc(var Message: TMessage);
begin
  FOldWndProc(Message);
  if Message.Msg = WM_NCLBUTTONDOWN then
    if FControl is TSomeCustomControl then
      ShowMessage(TSomeCustomControl(FControl).Caption);//this property exists
end;

如果WM_NCLBUTTONDOWN未到达,则邮件不会发送给您的控件。

我担心你的演员。当你写:

LOverrideMessage.FControl := TSomeCustomControl(lControl4);  
LOverrideMessage.FOldWndProc := TWinControl(lControl4).WindowProc;
TWinControl(lControl4).WindowProc := LOverrideMessage.OverrideWindowProc;

为什么你需要这些演员阵容?如果lControl4来自TWinControl,则您不需要这些演员表。如果lControl4具有较少派生的编译时类型,则至少包括is项检查。