【问题标题】:Is it possible to track a PostMessage between processes?是否可以在进程之间跟踪 PostMessage?
【发布时间】:2013-03-20 00:20:09
【问题描述】:

我们有一个系统,其中通常有两个进程在同一个系统上运行。一个进程处理 GUI,另一个进程像服务一样运行(尽管由于历史原因,它不是服务,只是一个没有可见窗口的 exe)。

这两个进程主要通过异步注册消息来进行 IPC - 即我们在两个进程中使用RegisterWindowMessage() 来定义大量消息,这些消息有效地形成了服务器进程的 API。

我编写了一个“免提”监控应用程序,它使用SetWindowsHookEx() 来监控和显示两个进程的消息队列,并提供对 API 的使用方式和通知如何传播到的某种程度的解码GUI 进程(每个单独的窗口都可以直接订阅来自服务器的通知)。

因此,双向都有大量消息,因此我有过滤和汇总计数等,因此我可以专注于特定活动。所有这些都可以在不影响实时代码的情况下完成,这很好。

这一切都很好,但是现在能够“标记”源自 GUI 的消息非常有用,这样我就可以在服务器处理相同的消息时对其进行跟踪。这对于调试和诊断系统问题将非常有用,但是如果不向我们注册的消息 API 添加此类支持,我找不到一个干净的方法(实际上我找不到任何方法!),这将是很多工作,并且涉及比我目前感到舒服的更多风险。由于服务器预处理了一些消息,然后将PostMessage() 返回到自身以执行操作,因此变得更加复杂,因此原始消息可能会“丢失”。

这里有人解决过这类问题吗?如果是这样,你能给我一些指示吗?如果没有,那么是否有任何记录或未记录的方法可以将一小块数据添加到 Windows 消息并稍后检索它?我查看了SetMessageExtraInfo(),但这似乎是每个队列而不是每个消息。

【问题讨论】:

  • 如果您注册的消息都没有同时使用wParam 和lParam,您可以将您的标签存储在那里。
  • 谢谢 - 但 wParam 和 lParam 使用得很好 :-( 事实上,API 实际上通过 MMF 中的 struct 传递消息中的大量数据,太多细节无法在这里解释一下。我不想惹那些struct的,这是问题所在。
  • 这不是一个选项,别再找了。
  • 您如何“跟踪”这些消息?您是否已经判断服务器中的消息 A 是否是其中一个客户端发送的消息 B?如果是这样..“标记”并记住“嗅探器”中的消息怎么样?
  • 我假设你在挂钩 PostMessage。如果您可以确定谁调用了PostMessage,您可以将消息参数和调用者保存在一个列表中,以便当它从消息队列中删除时,您可以找到它并获取调用者。您必须在这里小心,以确保您保存的每条消息都被清除。或者您可以保存时间戳并定期清理旧消息的缓存。

标签: windows winapi visual-c++ visual-studio-2012 trace


【解决方案1】:

FindWindow 或 FindWindowEx 将为您提供 GUI 窗口的详细信息。将详细信息与截获的消息进行比较

【讨论】:

  • 嗯,我知道这两个 HWND,但是在 MSG 结构中没有什么可以比较来将源与目标联系起来。 GUI 将出于不同的原因(例如用户命令、计时器等)发送多条消息,并且消息内容是相同的。我需要单独跟踪每条原始消息。
  • 除非我们在消息中添加额外的信息,否则不可能找出来源。
  • 没错——因此是我的问题 ;-) 我宁愿不更改我们的 API 以包含跟踪信息,因为它被第三方使用。我可能正在寻找一种“标记”消息的无证方式 - 我认为这样的事情不存在,但我很感激你花了一些时间来提供帮助,所以无论如何 +1。
  • 感谢罗杰,是的。您已经在问题陈述中提到了它。然而,在一些失败的尝试之后,我的回复是出于沮丧。而且我意识到 Windows 操作系统的哲学总是像 - 线程处理消息不会打扰它来自哪里,它只是处理它。
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多