江湖救急,后天就要交。求一个监视记事本保存操作的消息钩子(hook)实例代码

book_birdhzx 2014-03-21 07:29:44
刚到公司,给了个任务,折腾了一周,原来做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要慢慢补?。。。

...全文
261 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
book_birdhzx 2014-03-21
  • 打赏
  • 举报
回复
顺便吐槽下demo3,微软官方的demo居然把不能实现的功能做上来。。。。
book_birdhzx 2014-03-21
  • 打赏
  • 举报
回复
to: wyd1520 api方式也是一条路,但是1来时间不够了,2来这个方式有遗漏(万一它不调用这个api,现在sdk又多, 真说不准),不稳定,过于复杂(好像用修改iat前几个字节跳转再跳回来,还要处理同步问题。。。)。 其实我只是要知道记事本在什么时候干了某件事,通知我就可以 我继续折腾把。。。。谢谢你们的回复。。
book_birdhzx 2014-03-21
  • 打赏
  • 举报
回复
to:zanfeng ------------------------ setwindowshookex()安装全局钩子本身确实提供了一个【插入别人的进程空间】的机制, 我能捕获【所有】消息了,自然就【插入】了。 :demo1:Global System Hooks in .NET by Michael Kennedy , http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET 它就是用一个c#程序和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 demo2则是在c#程序和dll回调函数之间用一个消息来通讯,看着还真别扭。。。 也确实要做成dll形式方可捕获所有的消息,反之不将回调用dll分开实现,是捕捉不了全局 详细可见,这个例子不分离,一hook全局就失败。。。即使是hook的WM_MOUSE_LL demo3:http://code.msdn.microsoft.com/windowsdesktop/CSWindowsHook-a578ed12 ========= 唉,希望周末能搞定。。动手能力太差了我。。。
本拉灯 2014-03-21
  • 打赏
  • 举报
回复
引用 4 楼 zanfeng 的回复:
[quote=引用 3 楼 wyd1520 的回复:] 你要的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.[/quote] 那楼主就是想要这个http://easyhook.codeplex.com/SourceControl/latest 注入的。。
book_birdhzx 2014-03-21
  • 打赏
  • 举报
回复
to:wyd1520 非常感谢,但是这两个demo都是findwindow方面的,没有消息扑捉功能。 我之前在codeproject搜spy,大都是指根据获取窗口本身信息的,呵呵,不过还是谢谢了, 我主要想通过spy++消息跟踪功能,看看它的跟踪实现,反向查查win的消息是如何传递和扑捉的。
足球中国 2014-03-21
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
你要的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.
本拉灯 2014-03-21
  • 打赏
  • 举报
回复
你要的Spy++ http://www.codeproject.com/Articles/25925/CWindow-A-wrapper-class-for-the-window-API-functio http://www.codeproject.com/Articles/34981/FindWindow
book_birdhzx 2014-03-21
  • 打赏
  • 举报
回复
新手,能帮忙给个实现么,不胜感激
  • 打赏
  • 举报
回复
小技巧也能耽误一周,这个公司看来产品卖得很好,并不急于设计开发新产品。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧