日期:2014-05-16  浏览次数:21127 次

江湖救急,后天就要交。求一个监视记事本保存操作的消息钩子(hook)实例代码
本帖最后由 book_birdhzx 于 2014-03-21 19:37:24 编辑
刚到公司,给了个任务,折腾了一周,原来做delphi,c#也不是很熟,始终没折腾出来。
需求:监控某种应用程序的某个功能,比如word,记事本的保存操作,插入自己的一段处理。

应用程序功能拦截目前有两种方式,拦截消息和拦截api,鉴于消息更底层和通用,可以避开api
拦截的函数调用不确定性,以免遗漏。我确定采用消息拦截,在回调函数中实现功能。
查了windows的消息机制得资料,基本都在采用微软提供的win api 函数setwindowshookex().
它提供了WM_MOUSE,WM_KEBOARD,WM_CBT,WM_GETMESSAGE,.....大概七类消息的拦截,

翻遍了codeproject和csdn的代码库,基本只有鼠标,键盘这两类得demo,基本没有其他类型的
拦截demo,键盘,鼠标消息传递与组织相对比较简单,我想这也是demo较多得原因。
可见:demo1:Global System Hooks in .NET by Michael Kennedy ,
   http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET
但是其他类型的拦截,如保存操作,就找不到相关demo了
(我用spy++看了下,记事本的保存,会产生一个固定ID的WM_MENUSELECT,不管是来自键盘0,和来自鼠标选择1菜单)
这个应该是最接近的了,全局钩子好像要把回调函数用dll实现。
地址:DEMO2:Using Window Messages to Implement Global System Hooks in C#
http://www.codeproject.com/Articles/18638/Using-Window-Messages-to-Implement-Global-System-H

下了这个demo,在WM_CBT,WM_GEMESSAGE这两类消息拦截里找了几天的WM_MENUSELECT,WM_COMMAND,加上刚从delphi转到c#,有思路但是仍未实现。

原理我认为是肯定可行的:记事本的保存操作,一定会向指定窗口,发送指定类型WM_MENUSELECT的指定消息号ID
的消息。看在setwindowshookex提供的拦截消息机制下,如何截获即可。(这个折腾不出来。。。。。)

现求一个demo,能用拦截消息方式,拦截所有记事本得保存操作,在回调函数中,提示一个messagebox就行。
谢谢,周一要交了
,这份工作的第一个job,唉,各位兄弟拉我一把。来个实现了功能的demo,我学习下就能豁然开朗。
唉,要是有spy++的源代码就好了。。。。。急!谢!我继续折腾去了。。。。话说微软就没有成套完整的消息机制
资料?。。还是msdn要慢慢补?。。。


------解决方案--------------------
小技巧也能耽误一周,这个公司看来产品卖得很好,并不急于设计开发新产品。
------解决方案--------------------

你要的Spy++ 

http://www.codeproject.com/Articles/25925/CWindow-A-wrapper-class-for-the-window-API-functio 
http://www.codeproject.com/Articles/34981/FindWindow
------解决方案--------------------
引用:

你要的Spy++ 

http://www.codeproject.com/Articles/25925/CWindow-A-wrapper-class-for-the-window-API-functio 
http://www.codeproject.com/Articles/34981/FindWindow


这个和楼主要的不是一个东西吧。
他好象要的是记事本保存的。
这样的就需要在别人进程空间插入代码或者把dll勾到那上面。理论上c#生成的不是标准的dll.如果要插入别人的进程空间需要做的东西太多。还不如直接用c写。就算是用c写。也还要完全分析那个程序。记事本估计还简单一些。如果是WORD还是挺麻烦。毕竟一些格式结构还是比较麻烦。
楼主可以搜一下,NET 的apihook.