关于MS SPY++的消息拦截,郁闷中~~~~~~~``!(100分)

  • 主题发起人 主题发起人 YuZi
  • 开始时间 开始时间
Y

YuZi

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:
  MS SPY++的消息拦截模块能将拦截到的消息区分为“Sent”和“Return”两种,而且在返回型消息会有个IResult值,SPY是否是根据这个值区分"Sent"和"return”的呢?那这个值又是如何得到的呢?
  我利用子类化的方法拦截到各种消息成功,但在窗口过程的几个参数中没有哪个参数跟消息“类型”有关系的(上面的S、R两种类型),窗口过程返回值也无法判断。
不知道是否有专门的API检测?请知道的朋友帮忙指点一下,在下感激不尽!
 
这类难度较高的问题很少能找到圆满答案,建议多买点书.并不是DFW没有能人.

是学到这份上再去DFW帮人的少了,初学时DFW确能给予很多答案,后来一天比一天少.

现在基本就没有人回答了.因为是问题的难度加大了.
 
郁闷的平方~~
 
参考MS SPY++的HELP:
MS SPY++的消息拦截模块将拦截到的消息分为四种 'P','S','s','R':
1、'P'表示通过PostMessage发送的消息
2、'S'表示通过SendMessage发送的消息
3、凡是通过SendMessage发送的消息都有返回值,所以每一条'S'都会有对应的一条'R'表示消息的返回值
4、's'也是通过SendMessage发送的消息,但是由于安全原因无法访问其返回值
 
也就是说你看到的'R'和它对应的'S'实际上是一条Message,不过'S'中显示的是SendMessage的参数,'R'显示的是其返回值
 
晕倒~~~~~~~`
独帅真是个细心的人,谢谢了!
我机子上的SPY++6.0只有两个文件:SPYXX.EXE和SPYHK55.DLL,可惜没装VC。。。。一直想要过滤掉没有返回值的消息,竟然想当然地认为。。。真是让人笑掉大牙。。。。。
那您认为SPY是如何将消息区分为 'P','S','s','R'四种的呢?特别是那个IResult返回值到底是从哪来的?
如果可以判断“S”和“R”的区别或者有没有IResult返回值,那我就可以过滤掉更多无用的消息了。
 
insendmessage 标识消息是否通过sendmessage发送
replymessage 向通过sendmessage发送消息的函数返回一个消息处理的返回值


PostMessage 没有
 
Win32程序对不同类型Message的处理过程不一样,对于Post过来的Message(通过PostMessage发送),会由GetMessage来处理,对于Send过来的Message(通过SendMessage发送),则由CallWndProc来处理,并在处理完成后执行CallWndRetProc,所以要HOOK并区分这两种Message需要同时处理三个HOOK:WH_GETMESSAGE、WH_CALLWNDPROC和WH_CALLWNDPROCRET。
所以:
1、'P': 通过WH_GETMESSAGE可以得到PostMessage发送的Message
2、'S': 通过WH_CALLWNDPROC可以得到SendMessage发送的Message
3、'R': 通过WH_CALLWNDPROCRET则可以得到SendMessage的结果,也就是你要的IResult
 
谢谢全文检索!
InSendMessage能够判断是不是SendMessage发出的消息。
但SPY拦截到的消息的lResult值是怎么来的呢?
我再明了一下我的难题:
我拦截到“两个消息”,消息ID相同,但SPY中这两个消息一个标记为“S”,另一个标记为“R”,标记为“R”的有个lResult值为1,标记为“S”的没有。标记为“R”的消息对我有用,标记为“S”的对我没用,我想通过一种方法过滤掉为“S”的消息,但根据我拦截到的消息数据无法区别这两条消息哪条是“S”哪条是“R”。
SPY在拦截时到底是用何种方法区分这些消息的?
 
我回复的ID是3459644,YuZi兄回复的ID是3459650,看来以后在PostMessage之前要先GetMessage才行啊,哈哈[:D]
 
to 独帅:
我仅仅用WH_GETMESSAGE就得到了跟SPY同样消息ID、同样数量的消息。
我想SPY的那几种不同标记的消息应该不是由于几种钩子作用的结果。
 
to YuZi:
我没测试过,只是根据MSDN的文档来判断的,你不妨先利用WH_CALLWNDPROCRET测试一下IResult,这个问题留待以后再说[:)]
 
谢谢独帅!!!
我再祈祷几天,如果实在不行就通过wParam的值来间接判断吧,特定的消息,“S”消息wparam值无效,而“R”类消息则有效。。。。
 
在WH_CALLWNDPROCRET的HOOK过程中有lResult,但在子类化后的窗口过程中怎样获得lResult值就不得而知了
 
1、SPY++是通过HOOK拦截消息的,所以需要同时设置三个HOOK(WH_GETMESSAGE、WH_CALLWNDPROC和WH_CALLWNDPROCRET)来完成消息的拦截,区分消息的类型就是我上面说的方法;
2、楼主是通过子类化的方法拦截的,所以只要“重载”子类化窗口过程函数 (SubClassWndProc) 就可以拦截所有的消息了,应该可以通过原来的窗口过程函数(WndProc) 获取其返回值IResult;
3、因为你和SPY++的原理就不一样,所以就无法区分'P'、'S'了。
 
用工具很容易看到SPY++使用了四个钩子:WH_CBT WH_GETMESSAGE WM_CALLWNDPROC WH_CALLWNDPROCRET,但我依然无从想像,它到底如何组合使用那3个消息HOOK。。。。。

独帅兄,您说的“应该可以通过原来的窗口过程函数(WndProc)”,我之前也是这么想的,但那个返回值一直是0,而用SPY++截下的“R”类消息的lResult值却是1。
看来这个问题比较郁闷~~~~~
 
呵呵,身体更重要,不要轻易就郁闷~~~~~
要知道SPY++的工作方式,可以参考MSDN中的一个SPY Sample,该Sample在MSDN/SAMPLES/VC98/SDK/SDKTOOLS/SPY目录下,没有的话也可到Microsoft网站下载Visual Studio 6.0 Samples, http://www.microsoft.com/downloads/details.aspx?FamilyId=AF0A6060-6566-408F-9F11-EA2C80B8CAA0&displaylang=en

该Sample实现了WH_GETMESSAGE和WM_CALLWNDPROC,你可以参考它很容易实现WH_CALLWNDPROCRET

如果用子类化的方法,你要的返回值应该就是使用CallWindowProc调用原来的窗口过程函数(WndProc)的返回值,不知道你是如何做的?
 
呵呵,谢谢呀,我测试的正是窗口子类中的
Result := CallWindowProc(data^.OldWndProc, wnd, Msg, wParam, lParam);
可惜返回值总是为0,跟SPY++的不一样。
我已经用wparam参数判断凑合解决了过滤的问题,
唉,明天结贴吧~~~~~现在感觉DFW人气好像有点异样呀~~~~`
 
谢谢几位朋友,如果分数不均,请见谅!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部