如果说要捕获某个控件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或者是别的什么技术?请大侠们指点迷津……
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或者是别的什么技术?请大侠们指点迷津……
解决方案 »
- ClientDataSet在线程中使用的问题
- 请问下当我们调用TForm1.create(Self)创建窗体的时候,delphi是在哪里,什么时候,哪个函数来创建窗体的?
- 高手请进:在DELPHI6中安装ACTIVE X控件'Microsoft Office WEb Components 9.0 (Version 1.0)"出错?
- KeyDown中的key如何转化成对应的字符?
- 为什么执行出错?详情请看
- 报表简单问题关注有分
- 颜色
- 谁知道怎么用DIRECTSOUND播放a率的语音文件啊!
- 郁闷,散分!
- 用TADOQuery怎么对DBF库进行物理删除?
- 一次 update 只更新,表中的几个相同的记录中的一个,请问sql 如何写?
- 再一个关于StringGrid的问题!
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;
非常感谢“ ysai(蓝色忧郁) ”!结贴以表谢意!