Delphi 如何使用上下文外钩子仅处理最新消息

Delphi 如何使用上下文外钩子仅处理最新消息,delphi,focus,hook,Delphi,Focus,Hook,在我的应用程序中,我使用winevent钩子在系统范围内获得焦点更改。因为没有时间问题,所以我使用了上下文外的钩子,即使我知道它很慢。如果有多个事件一个接一个地快速触发,系统会对它们进行排队,并按正确的顺序将它们提供给钩子回调函数 现在我只想处理最新的焦点变化。因此,如果队列中已经有其他消息,我希望回调函数停止并使用最新消息的参数重新启动。有什么方法可以做到这一点吗?当您收到焦点更改时,为自己创建一个异步通知,并取消以前可能仍挂起的任何通知 您可以使用PostMessage()和PeekMess

在我的应用程序中,我使用winevent钩子在系统范围内获得焦点更改。因为没有时间问题,所以我使用了上下文外的钩子,即使我知道它很慢。如果有多个事件一个接一个地快速触发,系统会对它们进行排队,并按正确的顺序将它们提供给钩子回调函数


现在我只想处理最新的焦点变化。因此,如果队列中已经有其他消息,我希望回调函数停止并使用最新消息的参数重新启动。有什么方法可以做到这一点吗?

当您收到焦点更改时,为自己创建一个异步通知,并取消以前可能仍挂起的任何通知

您可以使用
PostMessage()
PeekMessage(PM\u REMOVE)
进行此操作。向自己发布自定义消息,删除队列中以前的任何自定义消息

或者,您可以使用
TTimer
/
SetTimer()
在每次焦点更改时(重新)启动计时器,然后在计时器过期时处理最后一次更改

无论哪种方式,只要消息速度减慢,就只处理最后一个通知