昨天我才给别人回复了一个这种方法,结果你又提出来,唉!procedure TForm1.FormCreate(Sender: TObject); var FButtonInstance: TFarProc; begin FButtonInstance := MakeObjectInstance(ButtonWndProc); // 转化一下 FDefWndProc := Pointer(GetWindowLong(Button1.Handle, GWL_WNDPROC)); // 取原来的窗口函数 SetWindowLong(Button1.Handle, GWL_WNDPROC, Longint(FButtonInstance)); // 设置成咱们自己的 end;procedure TForm1.ButtonWndProc(var Message: TMessage); begin // 这里会传入Button1的消息,你可以用Message来判断消息和处理 // 用下面的语句调用它原来的处理。 with Message do Result := CallWindowProc(FDefWndProc, Button1.Handle, Msg, wParam, lParam); end;
to all:人家问的是控件,不是应用。 to linux:不明白你的意思。写控件时经常要用到消息处理啊,这句 procedure Button1Click(Sender:TObject);message WM_ACTIVATE;很有问题。须知wm_activate在窗口世界中是非常频繁的。你想干什么?
这几句话是错的,可以给控件的方法加,但是需要有个TMessage或TMsg类型的参数。
var
FButtonInstance: TFarProc;
begin
FButtonInstance := MakeObjectInstance(ButtonWndProc); // 转化一下
FDefWndProc := Pointer(GetWindowLong(Button1.Handle, GWL_WNDPROC)); // 取原来的窗口函数
SetWindowLong(Button1.Handle, GWL_WNDPROC, Longint(FButtonInstance)); // 设置成咱们自己的
end;procedure TForm1.ButtonWndProc(var Message: TMessage);
begin
// 这里会传入Button1的消息,你可以用Message来判断消息和处理
// 用下面的语句调用它原来的处理。
with Message do
Result := CallWindowProc(FDefWndProc, Button1.Handle, Msg, wParam, lParam);
end;
to linux:不明白你的意思。写控件时经常要用到消息处理啊,这句 procedure Button1Click(Sender:TObject);message WM_ACTIVATE;很有问题。须知wm_activate在窗口世界中是非常频繁的。你想干什么?
2、增加一个消息响应方法:
procedure WMDropFiles(var msg: TWMDropFiles); message WM_DROPFILES;
当资源管理器拖动文件到你的窗体时,会有这个消息发生。
其中的msg.Drop是一个句柄,使用它,你用DragQueryPoint可以查询拖放到的点, 用DragQueryFile查询文件名,最后记住用DragFinish释放系统分配的内存。看看API的帮助吧。祝你好运!