【发布时间】:2015-07-02 06:51:17
【问题描述】:
在我的应用程序中,我使用 wevent 挂钩来获取系统范围内的焦点更改。因为不存在时间问题,所以我使用了上下文之外的钩子,即使我知道它很慢。如果有多个事件一个接一个地快速触发,系统会将它们排队并按正确的顺序将它们交给钩子回调函数。
现在我只想处理最新的焦点变化。因此,如果队列中已经有其他消息,我希望回调函数停止并使用最新消息的参数重新启动。有没有办法做到这一点?
【问题讨论】:
在我的应用程序中,我使用 wevent 挂钩来获取系统范围内的焦点更改。因为不存在时间问题,所以我使用了上下文之外的钩子,即使我知道它很慢。如果有多个事件一个接一个地快速触发,系统会将它们排队并按正确的顺序将它们交给钩子回调函数。
现在我只想处理最新的焦点变化。因此,如果队列中已经有其他消息,我希望回调函数停止并使用最新消息的参数重新启动。有没有办法做到这一点?
【问题讨论】:
当您收到焦点更改时,为您自己创建一个异步通知,并取消之前可能仍处于待处理状态的任何通知。
您可以为此使用PostMessage() 和PeekMessage(PM_REMOVE)。向您自己发布一条自定义消息,删除之前仍在队列中的任何自定义消息。
或者,您可以使用TTimer/SetTimer() 在每次焦点更改时(重新)启动计时器,然后在计时器结束时处理最后一次更改。
无论哪种方式,一旦消息变慢,只会处理最后一个通知。
【讨论】: