如果说要捕获某个控件TMyControl的某个消息WM_MYMESSAGE,你会告诉我如下形式的方法:
interface
procedure MyMessage(var Msg:TMyMessage);message WM_MYMESSAGE;
...
implementation
procedure TMyControl.MyMessage(var Msg:TMyMessage);
begin
...
end;
是的,我一直这样做,而且很爽。但是,如果要在运行期设置捕获,就不是这么简单了。设计期,你可以为TMyControl输入上述代码,就可以捕获处理WM_MYMESSAGE消息。但是运行期,你总不能输入代码吧!
例如,自己做一个控件TMyControl,可以放在TForm上。该控件有一个功能就是:能够捕获并处理TForm的某个消息,但TForm并对他一无所知。
是不是要用hook或者是别的什么技术?请大侠们指点迷津……

解决方案 »

  1.   

    我不太明你的意思,可用一WndProc取得所有的消息,再分別處理啊!
      

  2.   

    子类化技术,例,捕获ListBox的WM_VSCROLL消息:
      TfrmMain = class(TForm)
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      end;implementationvar
      ListBoxOldWProc      : TFNWndProc;function ListBoxNewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
      Longint; stdcall;
    begin
      Result := CallWindowProc(ListBoxOldWProc, Handle, Msg, wParam, lParam);
      if Msg=WM_VSCROLL then beep;//这里让它发声
    end;procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      inherited;
      ListBoxOldWProc    := TFNWndProc(SetWindowLong(ListBox1.Handle, GWL_WNDPROC,
        Longint(@ListBoxNewWndProc)));
    end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if ListBoxOldWProc<>nil then  //还原,别忘了
        SetWindowLong(ListBox1.Handle, GWL_WNDPROC,
            Longint(ListBoxOldWProc));
      inherited;
    end;
      

  3.   

    以前只在VC里用过子类化的方法,从未想过Delphi里能采用这样思想!
    非常感谢“ ysai(蓝色忧郁) ”!结贴以表谢意!