水军来了,钩子程序截获消息不成功,大家帮忙看看。
delphi吧
全部回复
仅看楼主
level 7
OOPhappy 楼主
前几天买了一个吧友的书《Delphi下深入Windows核心编程》,真心是个好东西。现在在自学。其中关于钩子原理一节,自己想模仿书上编一个程序,截获电脑上弹窗的程序。就是想截获QQ、搜狐新闻这种弹窗。可是貌似不成功。
这是安放的钩子:
HookHandle := SetWindowsHookEx(WH_CBT,TestHookProc,HInstance,0);
这个钩子只能截获当前程序的消息。书上说将SetWindowsHookEx(WH_CBT,TestHookProc,HInstance,0)中最后一个设置为0是截获所有的系统消息。然后WH_CBT表示截获的消息类型是发生激活,创建,关闭、极小化,极大化,移动和改变一个窗体等。下面是处理截获的消息。
function TestHookProc(Code:Integer;WParam:Longint;Msg:Longint):Longint;stdcall;
begin
if(Code = WH_CBT) then
Form1.Memo1.Lines.Add('something happend!');
Result := CallNextHookEx(HookHandle,Code,WParam,Longint(@Msg));
end;//这个是消息处理,我只是截获到了消息就显示一次可是到运行时。当我运行电脑上-附件-计算器的时候,系统没有截获到消息,而且该消息只对当前自己编写的Delphi程序有效。
现在请大神或者高手看看我的代码有什么问题?任何提示都可以砸过来。
2014年02月20日 08点02分 1
level 6
ttp://baike.baidu.com/view/1817274.htm
SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
线程钩子用于监视指定线程的事件消息。线程钩子一般在当前线程或者当前线程派生的线程内。
系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。
引入动态链接库(Dynamic Link Library)必要性
在本例中,由于我们要安装一个全局钩子,必须将和钩子有关的函数放在一个动态链接库(DLL,Dynamic Link Library)中。所谓动态链接库,就是在程序需要时可以被装入内存的函数库。通常我们把这个过程称为注入(Injection)。
由于32位 Windows下的每个应用程序都拥有自己的地址空间,无法相互访问,如果我们把钩子放在EXE程序中就不能监控其它程序鼠标操作了,所以必须引入 DLL。
2014年02月20日 08点02分 2
level 8
现在研究是很多年前的核心了,很多都没有HANDLE 了 你还核心个毛线啊
2014年02月21日 07点02分 4
1