Windows 消息 - 捕获来自另一个 API 的调用

Posted

技术标签:

【中文标题】Windows 消息 - 捕获来自另一个 API 的调用【英文标题】:Windows Messaging - trapping calls originating from another API 【发布时间】:2010-12-23 09:04:04 【问题描述】:

场景:

我们正忙于将第 3 方的 C++ SDK 打包为 DLL,以便我们组织中的其他开发人员更轻松地将此功能集成到他们自己的应用程序(无论是 .net、delphi 等)中

底层系统向系统中发生的事件发送 Windows 消息。需要处理这些事件,因为它们可能表明系统的状态以及下一步可以做什么。

问题:

在我们正在采用的方法(即包装第 3 方 SDK 的 DLL)的上下文中处理这些消息的最佳方法是什么?想到的一些想法:

    让使用 DLL 的应用程序捕获消息,然后通过函数调用将其传递回 DLL 进行处理——调用应用程序甚至可以捕获这些消息吗? 从 DLL 中生成一个线程,该线程实现一个消息泵,处理来自底层系统的这些消息并冒泡我们自己的自定义消息?

为 SDK 提供的所有示例代码都使用单个 Win32 应用程序,该应用程序实现消息泵并在应用程序的上下文中处理消息。

自从我使用本机 Win32 进行 Windows 开发以来已经有很多年了,希望得到一些建议。

【问题讨论】:

【参考方案1】:

最简单的方法是制作代理 DLL。基本思路是用你自己的API DLL替换,把你想要的函数替换掉,剩下的转发给原来的API DLL。您重命名原始 DLL 并使用 API DLL 的原始名称放入您的。为此,您需要导出函数。 Microsoft 使用 Visual Studio 使这变得相当简单。

导出函数的方法如下:http://msdn.microsoft.com/en-us/library/z4zxe9k8%28v=VS.100%29.aspx

如果你不知道他们正在使用的 API 的函数调用,有一个名为 PE Explorer 的实用程序可以告诉你所有关于函数的信息。一张营业执照的费用为 229 美元,但看起来物有所值:http://pe-explorer.com/peexplorer-tour-function-view.htm

有一些方法可以替换内存中的 API 调用,但它很复杂,需要 API 已经处于活动状态(除非您密切监视系统)并且可能会触发防病毒程序。

【讨论】:

不是我想要的,但是有用的答案。我试图了解源自 API 的 Windows 消息,以及如何最好地将它们传递到使用我的“代理”DLL 与 API 对话的最终应用程序。

以上是关于Windows 消息 - 捕获来自另一个 API 的调用的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 承诺在没有错误时捕获块启动

来自 CreateWindow/CreateDialog 的 HWND 可以从另一个线程获取消息吗?

从 Windows API 返回的消息

BizTalk 捕获 Http 响应代码

如何正确处理来自 MSFTEDIT_CLASS (RichEdit) 控件的 Windows 消息?

无法接收/捕获 Windows 消息