有winsight32和spy++都能检测到应用程序的窗口句柄, 像form,edit,button这些组件都有句柄,效果和windowfrompoint()差不多.但有些组件没有句柄的,像image,label等控件,我想给这些事件发送一些消息(键盘,鼠标消息),要怎样才能发送?
没有句柄不能用sendmessage和postmessage了.
谁有办法解决一下?

解决方案 »

  1.   

    你要做什么,非要对它们发消息不可?
    有句柄的是从TWinControl下继承的。
    没有句柄的是从TGraphicControl下继承的。
    除非你自己从TWinControl下继承写个控件。
      

  2.   

    是啊,label的基类不是窗口类楼主想做什么,有没有折中的方法
      

  3.   

    我想写一个程序,目的是想定时的给另一个程序中的一个image控件发鼠标消息.有没有什么办法可以达到.
      

  4.   

    如果你真的想对image控件发鼠标消息的话,那是做不到的。折中方法是:在程序中直接控制鼠标移到image控件位置上做动作。
      

  5.   

    我想从TComponent类派生一个有窗口句柄的控件,是不是需要自己来完成它的消息系统呢?
      

  6.   

    没有句柄是不能发消息的,可以考虑用keybd_event模拟键盘操作来实现
      

  7.   

    这样做试一试我觉得那个image肯定也是在一个窗口内的吧,要是能拿到image 所在窗口的句柄的话,就可以给这个窗口发鼠标消息,比如说发个单击消息,把位置定在image上就相当于是单击了image,会触发image的单击事件。举例来说,new一个form,name为formtest,放一个image,其单击事件中show个message,为了方便,我把这个image的align属性设置为alclient,这样单击(0,0)位置就能点到它。
    procedure TFormTest.Image1Click(Sender: TObject);
    begin
      ShowMessage('abc');
    end;再写个给它发送消息的程序
    procedure TForm1.Button1Click(Sender: TObject);
    var
      handle1: HWND;
    begin
      handle1 := FindWindow('TFormTest', nil);
      SendMessage(handle1, WM_LBUTTONDOWN, MK_LBUTTON, 0);
      SendMessage(handle1, WM_LBUTTONUP, MK_LBUTTON, 0);
    end;
      

  8.   

    我成功的为从TComponent类派生的类加入窗口句柄unit Test;interfaceuses
      Windows, Messages, SysUtils, Classes,Forms;type
      TTest = class(TComponent)
      private
        { Private declarations }
        FHandle : HWND;
      protected
        destructor Destroy; override;
        procedure WndProc(var Message: TMessage); virtual;
        { Protected declarations }
      public
        constructor Create(AOwner : TComponent); override;
        property Handle: HWND read FHandle;
        { Public declarations }
      published
        { Published declarations }
      end;procedure Register;implementation
    constructor TTest.Create;
    begin
      inherited;
      FHandle := AllocateHWND(WndProc);
    end;destructor TTest.Destroy;
    begin
      DeallocateHWND(FHandle);
      inherited;
    end;procedure TTest.WndProc(var Message: TMessage);
    begin
      if Message.Msg = WM_QUERYENDSESSION then Message.Result := 1 else
      try
        Dispatch(Message);
      except
        Application.HandleException(Self);
      end;
    end;
    procedure Register;
    begin
      RegisterComponents('Standard', [TTest]);
    end;end.