我想要开发一个不可视组件,想要截获一个可视控件的按件消息,要怎样实现,最好有源码
请高手们指点一下。

解决方案 »

  1.   

    type
      TMyImage = class(TImage)  private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    ...
    ...implementation
    ...
    ...procedure TMyImage.CMMouseEnter(var Message: TMessage);
    begin
    //响应清息时的代码
    end;
      

  2.   

    是一个非可视组件
    type
      TMultiSelectedRows = class(TComponent)
      private
     
          procedure wndproc(var message:Tmessage);
         { Private declarations }
      protected
        { Protected declarations }  public    Constructor Create(AOwner: TComponent); Override;
        destructor Destroy; override;
        { Public declarations }
      published
        { Published declarations }   end;...
    ...constructor TMultiSelectedRows.Create(AOwner: TComponent);begin
      inherited Create(AOwner);  FWindowHandle := AllocateHWnd(WndProc);  
    end;destructor TMultiSelectedRows.Destroy;
    begin
      DeallocateHWnd(FWindowHandle);  inherited;
    end;
    procedure TMultiSelectedRows.Notification(AComponent: TComponent;
      Operation: TOperation);
    begin
      inherited;end;
    procedure TMultiSelectedRows.wndproc(var message: Tmessage);
    begin
      //在这里怎么截不到 WM_LBUTTONDOWN 请高手们指占一下end;
      

  3.   

    用Hook抓
    容器不会转发消息到非激活态的控件的
      

  4.   

    截获一个可视控件的按件消息应该在可视控件里截获啊,
    用一个控件去截获另一个控件的消息应该用钩子技术吧。也就是Hook
      

  5.   

    type
    TMultiSelectedRows = class(TComponent)
    private
       procedure Mywndproc(var message:Tmessage);
    public
      Constructor Create(AOwner: TComponent); Override;
      destructor Destroy; override;
    end;...implementationvar OLDWndProc:TWndMethod;
      
    constructor TMultiSelectedRows.Create(AOwner: TWinControl);//TComponent 不行
    begin
      inherited Create(AOwner);
      Owner:= AOwner; 
      OLDWndProc := AOwner.WindowProc;
      AOwner.WindowProc := MyWndproc;
    end;destructor TMultiSelectedRows.Destroy;
    begin
      (Owner as TWinControl).WindowProc := OLDWndProc;
      inherited;
    end;procedure TMultiSelectedRows.Mywndproc(var message: Tmessage);
    beginend;
      

  6.   

    修改下:
    constructor TMultiSelectedRows.Create(AOwner: TComponent );可以用TComponent 的!