高分高难问题:如何在程序中Hook所有Form类的OnCreate事件? (300分)

  • 主题发起人 主题发起人 doxpix
  • 开始时间 开始时间
D

doxpix

Unregistered / Unconfirmed
GUEST, unregistred user!
问题描述:
一程序有Form1,Form2,Form3...多个窗体,均继承自TFormX类
(TFormX的源码找不到了),现需要新建一个类FormNew,希望能让Form1,Form2,
Form3创建的时候执行同一段代码.
这样不行了吧(因为没有TFormX源码啊,dcu文件都没有!)
TFormNew = class(TFormX)
Public
Constructor Create();overload;
...

然后
TForm1 = Class(TFormNew)
TForm2 = Class(TFormNew)
TForm3 = Class(TFormNew)
...

其实我只想给大家出个难题,最近水贴是不是太多了点?
 
你说的方法应该就可以啊,怎么不行?
从一个类继承要什么源码?只要Dcu有,同一delphi版本就行了。
 
呵呵,其实dcu文件是有的,pas文件都是有的.
只是我不想用继承的方法,改起来比较麻烦,
因为我是懒人嘛.

主要的是我想知道有没有这种可能性?
 
不明白你的意思啊
“这样不行了吧(因为没有TFormX源码啊,dcu文件都没有!)”
^^^
那怎么成?如果是那样,你的程序没法编译的。
实在不成就用继承吧,应该也麻烦不到哪儿去。

本来进来想写个“GZ”的,呵呵~
 
呵呵,我骗你了,dcu,pas文件都是有的.
其实我只想给大家出个难题,主要的是我想知道有没有这种可能性
(即在程序中能否Hook所有Form类的OnCreate事件?).
 
Hook WH_MSGFILTER,然后捕获WM_CREATE ,分析
lpszName,lpszClass是否是你的Form类型,你可以先编制dll,然后运行原来的FormX
程序,看看HooklpszName,lpszClass的结果,然后就可以用
内存映射文件(不能用SendMessage,会访问虚拟地址)通知你的分析程序(就是你希望
OnCreate时做的事情)!

你的分析程序在Timer控件中:
要不断读内存映射文件标志,例如

if (ReadCreateOn) then
showmessage('原来的FormX程序开始运行了!');

多句嘴:
procedure ReadCreateOn;external 'hook.dll' name 'ReadCreateOn';
注意必须用全局Hook!
 
to wql,再具体些吧,关注,哈哈~
 
《我是来自成都的男子汉,有三年开发经验。愿于各位共同进步,同创末来。QQ:156409293》
 
>> 这样不行了吧(因为没有TFormX源码啊,dcu文件都没有!)
恰好这就是最简单的方法: [:D][:D]
TFormNew = class(TFormX)
Public
constructor Create();override;
...
constructor TFormNew.Create;
begin
inherited;
//你的代码。
end;

再把对应的DFM的第一行改成
inherited FormNew: TFormNew

搞定。
 
xianjun,
老大,你犯规了.我说了不允许使用继承的方法!
因为那样我的所有form1,form2,form3...都要重新
从FormNew继承而来.

不使用继承的方法是可行的,但是我不知道人家
是怎么搞掂的.
 
wql,
再生成一个dll文件,太麻烦了吧.

我刚才看了看XPMenu的实现代码,发现用子类化
可以实现我的要求.
 
对啊!就是要假设没有源代码的情况下才能显示出水平!

因为假设TFormX是其他程序,所以必须用全局钩子!

若TFormX是你的内部程序,该问题就没有讨论意义了!
 
我用子类化解决了问题.
 
后退
顶部