Delphi 如何使用PeekMessage检查队列中的所有消息,而不删除它们

Delphi 如何使用PeekMessage检查队列中的所有消息,而不删除它们,delphi,Delphi,这看起来很简单,但我很确定这是不可能的 我想在给定时间检查WM队列中的所有消息,但我不想处理任何消息(PM_NOREMOVE)。问题是如果我: while PeekMessage(msg, 0, 0 PM_NOREMOVE) # do something with msg 我会永远被困在那里 有解决办法吗?不完全是 PeekMessage允许您查看消息并将其压扁或亲自分派,但除了队列上的第一条消息之外,您无法查看其他任何内容 这是出于设计——排队的消息需要按照接收顺序进行处理 但是,

这看起来很简单,但我很确定这是不可能的

我想在给定时间检查WM队列中的所有消息,但我不想处理任何消息(PM_NOREMOVE)。问题是如果我:

while PeekMessage(msg, 0, 0 PM_NOREMOVE)
     # do something with msg
我会永远被困在那里

有解决办法吗?

不完全是

PeekMessage允许您查看消息并将其压扁或亲自分派,但除了队列上的第一条消息之外,您无法查看其他任何内容

这是出于设计——排队的消息需要按照接收顺序进行处理

但是,所能做的是在分派消息之前查看所有排队的消息,这可能允许您做您想做的事情,但需要不同的代码结构


请记住,只有队列中的消息才会被看到,使用SendMessage直接发送的消息不会出现在队列中,因此您不会看到它-为此,您可能需要使用Windows挂钩或类似的工具。

是的,将
0,0
以外的内容传递给。您似乎还缺少一个参数,
PM\u NOREMOVE
循环将不起作用,因为
PM\u NOREMOVE
只能查看队列中的第一条消息。您必须实际删除消息才能看到队列中的其他消息。为什么不想删除邮件?这里的实际目标是什么?请提供更多详细信息。那么,记录消息队列不太可能有帮助。如果主线程停止运行,那么很明显是什么让它崩溃了。要么是主线程上存在长时间运行的代码,要么是某些消息以超出处理速度的速度充斥着队列。老实说,性能探查器似乎是执行此任务的更好工具。队列中尚未检索的消息不能暂停任何操作。@SertacAkyuz确实-事实上,它将是当前导致冻结的前一条消息。要找到哪一个,请附加调试器,点击暂停,查看调用堆栈的顶部。严格来说,这不是真的。通过向PeekMessage中的消息筛选器参数传递参数,您可以找到特定类型的第一条消息,即使它不是队列中的第一条消息。例如,如果第一条消息是WM_CHAR,而第二条消息是WM_MOUSEMOVE,则您可以过滤以获取第一条鼠标消息,忽略键盘消息等。但是,您无法在该消息下方查看任何其他鼠标消息。