gpt4 book ai didi

c++ - 以同步模式运行 Windows GUI 应用程序?

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:02 25 4
gpt4 key购买 nike

我正在 Windows 上调试 GUI 应用程序,我想找出消息的发送者。在 Linux 上,我可以在 synchronized mode 中运行应用程序并在调用堆栈中找到发件人。 windows有没有对应的模式?

最佳答案

据我所知,没有执行此操作的内置功能。<​​/p>

但让我们先调查一下这个问题。您想知道谁是邮件的发件人。然而,您应该知道 Windows 消息处理可以按以下标准分类:

  1. 已发布消息与已发送消息(PostMessageSendMessage)。
  2. 发送到属于另一个线程的窗口与发送者线程的消息。
  3. 发布到线程的消息(未绑定(bind)到特定窗口,因此不由窗口过程处理)。

只有当消息被发送(未发布)到窗口时,您才可以直接追踪发送者,而对SendMessage(或类似的)的调用是在窗口所属的线程。在这种情况下,您将在调用堆栈中看到发件人。

如果消息是从另一个线程发送的 - 您将不会在调用堆栈中看到它。很简单,因为调用栈显示的是只属于当前线程的调用链。当消息从另一个线程发送时,系统执行以下操作:

  1. 挂起调用者线程。
  2. 将此消息放入拥有该窗口的线程的队列中。
  3. 当该线程调用 GetMessage(或类似的)时 - 消息被分派(dispatch)到窗口。
  4. 最后,操作系统恢复调用者线程。 SendMessage 返回窗口过程返回的结果。

在这种情况下,您可以尝试间接识别来电者。使用断点中断您的程序,并尝试搜索挂起的线程,这些线程在对 SendMessage 或类似的调用中被阻止。

最后,发布的消息无法通过上述方法进行追踪。您可以尝试在对 PostMessage 的调用上放置条件断点,但如果调用者属于另一个问题 - 这将更加复杂。

关于c++ - 以同步模式运行 Windows GUI 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6184607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com