application的WndProc如何重写(100分)

  • 主题发起人 主题发起人 Baggiopw
  • 开始时间 开始时间
B

Baggiopw

Unregistered / Unconfirmed
GUEST, unregistred user!
我想通过重写应用程序的窗口过程wndproc来捕获消息,
窗体的wndproc容易重写,如:tform1.wndproc(var msg:tmessage);override;
但是如果要重写application.wndproc呢?不知道该写在什么地方;
还有,application和form的wndproc是不是就是同一个窗口过程?
如果程序在控制台运行,没有form,又该怎样重写wndproc?
 
application.HookMainWindow()

还有 OnMessage
 
其它的方法我也试过,但是就是想知道application.wndproc怎么重写
 
procedure TForm1.FormCreate(sender:Tobject);
begin
FNewWndProc := MakeObjectInstance ( NewWndProc);
FOldWndProc := Pointer(setWindowLong(Form1.handle,GWL_WNDPROC,integer(FNewWndProc)));
// 同样 form1.handle 也可以换成 application.handle
end;
 
運用嫁接,把application.wndproc嫁接給一指針
 
哦,不能像重写form1.wndproc一样覆盖application.wndproc吗?
 
兄弟太懒了,自己都不试试
 
试了,效果是达到了,谢谢。但是我还是想知道Tapplication里的方法怎么覆盖,是否可以
Type TNewApplication=class(Tapplication),然后再覆盖呢?试下先
 
试了:

const wm_MyMsg=wm_user+100;

type TNewApplication=class(Tapplication)
private
procedure WndProc(var message:tmessage);override;
end;
procedure TNewApplication.wndproc(var message: tmessage);
begin
if message.Msg=wm_MyMsg then
showmessage('application.wndproc');
inherited;
end;

编译时出错了:Method 'WndProc' not found in base class
但是TApplication类的定义里面有WndProc(var message:tmessage),结果在类里面没有找到方法,这是什么原因呢?
想到一个问题:全局变量Application对应本程序,也就是TApplication的一个实例,那么这么实例是怎么生成的呢?好象没有看到TApplication.Create.
 
WndProc是TApplication类的私有方法,所以是不能override.
Controls单元的initialization部分创建TApplication实例
 
哦,找到了[:)],一语解惑,多谢!
 
后退
顶部