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

标签 c++ windows linux debugging user-interface

我正在 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/

相关文章:

c++ - 如何知道 ncurses 的 initscr() 是否被调用过?

windows - Windows中将csv导入到hdfs时出错

c++ - 需要什么软件才能开始在 Windows 中开发无需 cygwin 或 .Net 等其他工具即可运行的 c/c++?

用于 Linux 的 RegEx 和 grep

linux - 管道将输入拆分为命令

linux - 花哨的命令行在Linux中是如何实现的?

C++ 异步与 OpenMP 任务

c++ - 从构造函数C++返回后丢失成员变量的值

c++ - MFC/C++ 相当于 VB 的 AppActivate

windows - 有没有办法以编程方式在 Windows 中配对蓝牙设备