防止挂钩函数中的重入
当挂钩函数处理事件时,可能会触发其他事件,这可能会导致挂钩函数在原始事件的处理完成之前重新进入。 挂钩函数中重入的问题在于,除非挂钩函数处理这种情况,否则事件是按顺序完成的。
例如,假设屏幕阅读器程序中的挂钩函数正在处理编辑控件的 EVENT_OBJECT_VALUECHANGE 事件。 如果在处理第一个值更改事件时重新进入挂钩函数以处理后续值更改事件,则第二个事件在第一个事件之前完成。 这种情况会导致屏幕阅读器向用户传达不准确的信息。
由于事件处理中断,因此每当挂钩函数调用导致拥有线程的消息队列被检查的函数时,都可能会收到其他事件。 当在挂钩函数中调用以下任一项时,就会发生这种情况:
- Windows SendMessage、 GetMessage、 PeekMessage、 DialogBox 或 MessageBox 函数
- Microsoft Active Accessibility 函数 AccessibleObjectFromEvent、 AccessibleObjectFromWindow、 AccessibleObjectFromPoint
- IAccessible 接口或其他跨进程边界 (COM) 属性或方法的组件对象模型
由于挂钩函数调用 AccessibleObjectFromEvent 和 IAccessible 属性和方法,因此无法阻止重新进入。 唯一的解决方案是客户端开发人员在挂钩函数中添加代码,该代码可检测重入,并在重入挂钩函数时采取适当的操作。