API钩子为什么会重复钩取信息?
delphi吧
全部回复
仅看楼主
level 7
OOPhappy 楼主
会的,不会的都可以来看看。我最近看《Delphi下深入Windows核心编程》,模仿书中写了一个钩子程序——钩Windows创建的窗体消息。代码跑是能跑,就是钩的消息是重复的,也就是说我只运行了一个Windows窗体:例如QQ,但是我确能钩得到N个重复的结果。代码如下:
2014年04月17日 07点04分 1
level 7
OOPhappy 楼主
function GetMsgPro(code:Integer;wPar:Integer;lPar:Integer):Integer;stdcall;
var
HHookInf:PCWPStruct;
//Buffer,
MyCaption:array[0..127] of Char;
LogInfo:string;
begin
if (Code = HC_ACTION) then
begin
HHookInf := PCWPStruct(lPar);
if HHookInf.message = WM_CREATE then
begin
GetWindowText(HHookInf.hwnd,MyCaption,SizeOf(MyCaption));
LogInfo := '程序创建,名称为:'+GetProcessExePath(HHookInf.hwnd);
Writlog(LogInfo);
Writlog('标题为:'+MyCaption);
end else if HHookInf.message = WM_DESTROY then
begin
GetWindowText(HHookInf.hwnd,MyCaption,SizeOf(MyCaption));
LogInfo := '窗口销毁,名称为:'+GetProcessExePath(HHookInf.hwnd);
Writlog(LogInfo);
end;
end;
Result := CallNextHookEx(DMessageHook,code,wPar,lPar);
end;
我将创建窗体的消息钩住,然后根据句柄获得文件名,为什么它会重复得到这个新建窗体的消息。应该怎么做?难道建立以个全局变量,保存前面的结果,如果当前值和保存的值相同,则我们舍弃结果?
2014年04月17日 07点04分 2
level 7
OOPhappy 楼主
楼主拙劣的文字表达能力。其实我描述的问题是:用我的代码监视系统中的创建的窗体时,当我启动一个窗体,钩子会获得窗体的基本信息,然后写入日志文件中。实际的运行结果是即使只启动了一次QQ,我的日志文件会记录下很多个QQ启动的消息。是代码问题?应该怎么解决。
2014年04月17日 08点04分 3
level 6
你去钩一下打不还手骂不还口的windows记事本就知道是代码问题还是QQ问题了。
如果记事本也钩不到,铁定是代码问题了。
2014年04月17日 08点04分 4
不是钩不到,是钩的消息好多是重复的。比如,我创建QQ,然后截获了一次QQ的创建的消息,记录下来,接着钩下一条消息,它还是QQ得创建消息,要重复好几遍才不会截获。
2014年04月17日 09点04分
level 12
打开一个QQ,他会同时创建2个进程,用来实现多账户登录,不知道是不是这个问题,你可以试着把窗口句柄保存一下,看是不是同一个窗体,windows不会发送多余的消息的。
2014年04月18日 00点04分 5
level 10
楼主是不是在 2CCC 提问 群发 QQ 消息 的问题来着?
2014年04月18日 01点04分 6
没有啊,2ccc上发帖子我还没碰到过。
2014年04月19日 14点04分
1