【问题标题】:how to debug messages on the queue, who sends them? and what is in the queue?如何调试队列上的消息,谁发送它们?队列中有什么?
【发布时间】:2015-12-07 10:43:18
【问题描述】:

事件队列是一个获取消息并处理它们的盒子。

请问PostMessage 和SendMessage 的消息存放在哪里?以及如何分辨谁发送了什么消息? 可以检查哪些变量来获取信息?

【问题讨论】:

  • 我将此重新标记为 winapi 问题,因为它不特定于任何特定语言。这个问题是否与您最近已删除的问题有关,您在其中询问将子窗口设置为最顶层?
  • 是的。我需要找出同一组件在一个窗口中向队列发送消息而不在另一个窗口中发送消息的原因。我将尝试查看队列,看看是否能找到该消息。
  • 是一个刷新数据的弹窗,为uesr类型。让我们说它的悬停数据。
  • WS_CHILDWS_POPUP 是互斥的(请参阅 Window Styles)。如果您对术语感到困惑,请参阅 Window Features 了解简介。
  • 好的,这就是问题所在。 WM_DRAWITEM 被发送到窗口的父级。您的窗口没有父级。如果您想要所有者绘制列表框,则需要创建一个窗口作为父窗口。

标签: winapi


【解决方案1】:

消息存储在哪里?

它们存储在与线程相关的内部数据结构中。请注意,每个线程都有零个或一个消息队列。消息队列不是为线程自动创建的,而是在线程调用需要消息队列的函数时按需创建的。

另请注意,发送的消息(由SendMessage 传递的消息)不会出现在队列中。发送的消息是同步的,因此没有排队。

如何分辨谁发送了什么消息?

一般来说这是不可能的:Can I determine which process sent my window a message?

可以检查哪些变量来获取信息?

你不能。您可以使用PeekMessage 来查看队列是否包含特定消息,或者查找给定范围内的第一条消息。但是没有转储整个消息队列的功能。

【讨论】:

  • 对已发送消息的小修正:跨线程发送的消息实际上存储在队列中,并在调用其中一个消息检索函数时分派,然后该消息检索函数返回第一个排队的消息。
  • @IInspectable 我认为这是一个实现细节。他们没有排队,因为我的意思是没有排队的消息。它们是同步的。
  • 重要的一点是,跨线程发送消息不直接调用窗口过程(与上下文发送消息的情况一样)。这不仅仅是一个实现细节,因为它会对您的代码产生影响。即,接收线程必须调用消息检索函数,以便分发跨线程发送的消息。一个推论是,窗口过程不需要防止多线程访问。
  • @IInspectable 我知道这一切。但我认为提问者是在询问消息队列。
猜你喜欢
  • 2014-01-28
  • 2022-10-19
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2020-04-18
  • 2012-11-18
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多