大家应该都知道, Win32 API的SendMessage方法可以跨进程使用...-> 可以在[进程A]中发送消息到[进程B]的某个窗体...而[句柄]指定的窗体在收到消息后由WndProc与DefWndProc窗口过程进行处理...-> 在这种情况下, [接收窗体]该如何判断.消息.是由<系统>还是<其他进程>发送过来的呢???当然, 我所指的<其他进程>也包括自身的...请问大家, 这种要求能实现吗??? 该如何实现呢???
解决方案 »
- 急!!!C#中我用FindWindow( )方法获得了窗口的句柄,我想用SendMessage()向窗口发送按键消息应该怎么做?
- 请教C#中如何实现远程注册功能
- C# List<string>遍历父节点和子节点的问题。在线等
- [XmlAttribute("connectionString")](在线等)
- 关于ADSI建虚拟目录的一些疑问,高手请进,高分想送您!只写Up的同志不要参与!
- 请教:winform关于组合框的高级用法
- 找不到类型或命名空间名称“XmlElement”(是否缺少 using 指令或程序集引用?)
- 自己做的一个小工具,调试ACCESSR 的SQL,希望大家喜欢
- winform中,如何调用系统软键盘中点击事件?
- 在调用OLE之前,必须将当前线程模式高为STA模式?什么意思
- 如何把.net dll里的私有函数改成公有函数?
- .NET下多语言合作开发,谁能给些资料?相信这个小问题也在很多朋友的脑袋里出现过.100分不多,大家把他顶起来.为有想法的小鸟们指条路
接收者根据ID就可以判断出要做的事。
至于如果要明确判断出发送者,不知道如何判断。
(是不是有这个必要?)
-> 我觉得Windows的消息值应该能标识消息发送者的句柄,可是找来找去没结果...-_-!!!
消息从是
信源->系统消息队列->hook->信宿
这个过程的。信源发送后,就退出这个过程,这是PostMessage。消息是宏观的序列化操作方法,线程调度是微观的序列化操作方法。
因为序列化操作。信宿处理消息的时候,信源很可能已经不存在了。不论是ProcessID还是ThreadID都可能不存在了。HWND就更不要想了。因为除了窗体,没窗体的程序,服务都可以发消息的。所以回溯消息是不可行也不容易保证正确的。所以是无法做到找到谁发的消息的。
你是想实现那个效果么?那个应该和你的出发点不同。你是不知道对方是什么。单从消息往回推,那估计是推不回去。但如果是spy++。我不知道如何作的。但如果是我。我可以尝试的修改我想使用SetWindowLong设置到我这里一个函数来处理消息,然后啥也不做的再调用他原来的消息处理方法,这样我就知道某个窗体收到了什么消息了。我只见过能监控别的窗体收到消息的工具。没见过能监视对方发送的。你说的软件叫什么?
那它是怎样实现呢???"这个工具是SPY++, 在windows中要拦截一个消息是可能的, 用全局或局部hook即可实现,
但即使hook了也只能拦截消息的内容, 同样无法获的发送方准确的说, 此题无解你硬要钻牛角, 推荐你研究一种方法, WIN32API hook, 监视所有调用过SendMessage, PostMessage的进程
你要真要做
作个全局钩子 监视调用SendMessage PostMessage的进程
就能知道了
--------------------
就是挂钩这两个API,这样当任意进程调用这两个函数的时候,
就会先执行你的代码.
然后你就可以做相应的处理.
2:自身模块被卸载后要把API地址改回去找IAT可以用ImageDirectoryEntryToData获取,方便点
对于SendMessage理论上是可以查找到源进程的
只要在消息响应函数中使用GetCurrentThreadID获得线程的ID,然后枚举所有进程,找到拥有这个线程的进程就可以。PostMessage就没办法溯源了
1.搜索系统所有进程列表保存;
2.往以上进程中加入hook,并且区分各个进程的hook,假设为hook[n];
3.各个进程的hook对该进程所发的message检测并收集,然后向我们的进程回报结果
4.我们可以根据汇报的hook的id,来去分是哪个进程发送的消息和什么样消息!
对于zzultc的方法, 好像不太可行...第一: 给所有进程加上Hook本来就不太现实...第二: 就算加上Hook, 也只能收集它所收到的消息, 那怎么检测它所发出的Message呢???是不是我不理解您的意思...
一、难以实现
二、难以稳定
三、系统消耗太大
四、杀毒软件不太欢迎Windows系统中每个API的调用, 都最终打包成服务请求,扔给了驱动, 系统维护着一张描述符表(SSDT), 这张表记录大部分服务的入口, 通过替换这些入口, 你可以钩住大部份API操作,比如注册表读、写, 大部分杀毒软件也将关卡设在这里, 比如卡巴斯基的注册表监控,
(当然我不肯定SendMessage、PostMessage的服务也在其中) , 也许这是最佳方法
如果仅仅是为讨论而讨论, 这个话题可以到此为止了, 因为最终你可能找不到答案!!
如果是为项目为工作而讨论, 建议重新规划思路, 另寻解决方案
都是窗口管理器里面实现的。