高手看看:有关消息和句柄的问题. 有winsight32和spy++都能检测到应用程序的窗口句柄, 像form,edit,button这些组件都有句柄,效果和windowfrompoint()差不多.但有些组件没有句柄的,像image,label等控件,我想给这些事件发送一些消息(键盘,鼠标消息),要怎样才能发送?没有句柄不能用sendmessage和postmessage了.谁有办法解决一下? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你要做什么,非要对它们发消息不可?有句柄的是从TWinControl下继承的。没有句柄的是从TGraphicControl下继承的。除非你自己从TWinControl下继承写个控件。 是啊,label的基类不是窗口类楼主想做什么,有没有折中的方法 我想写一个程序,目的是想定时的给另一个程序中的一个image控件发鼠标消息.有没有什么办法可以达到. 如果你真的想对image控件发鼠标消息的话,那是做不到的。折中方法是:在程序中直接控制鼠标移到image控件位置上做动作。 我想从TComponent类派生一个有窗口句柄的控件,是不是需要自己来完成它的消息系统呢? 没有句柄是不能发消息的,可以考虑用keybd_event模拟键盘操作来实现 这样做试一试我觉得那个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; 我成功的为从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;implementationconstructor 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. 封装Dll问题 请教,编程思路。 IDHttp下载问题 如何判断已输入的字符数, 求HTTP代理源码,那个朋友能给我? 一个简单的 String语句如何实现! 救命,倒库 高分 怎么把listbox的字段提出来? 报表问题 偶用access建立表,忘了设计主健,系统自动给加了个id,怎么能把这个id删了??还有,access中创建表时的 连接 作干什么用的?(牛虻) 如何在运行时刻,显示ADOConnection控件ConnectionString属性的设置对话框 有没有输入XML和XSL文件输出HTML结果的控件?
有句柄的是从TWinControl下继承的。
没有句柄的是从TGraphicControl下继承的。
除非你自己从TWinControl下继承写个控件。
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;
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.