我最初有一个 ActiveX 控件,它注册了一个每隔几秒触发一次的 Windows 计时器(使用 SetTimer()
)。到目前为止效果很好。现在为了实现全屏模式,我向我的控件添加了一个子窗口,它应该显示内容,而控件本身管理所有 ActiveX 内容。
我在使用这种方法时遇到的问题是我的 WM_TIMER 在某个时候突然停止触发。我已经将其追溯到 UIDeactivate()
在我的控件上被调用,但我不知道为什么在未调用此方法时调用它(我相信它与失去焦点有关)之前。
我还想知道为什么我的 WM_TIMER 事件突然停止,而其他一切似乎仍然正常工作。它与在子窗口中而不是在 ActiveX 控件本身上显示内容有什么关系?
最佳答案
计时器停止是有原因的。这可能是:
- 您可以通过调用
KillTimer
来停止计时器 - 您的窗口已重新创建且计时器未重新启用
- 您的控件是无窗口的,您实际上没有
HWND
句柄 - 计时器标识符发生冲突,那里有其他东西(例如内部子类窗口)使用相同的标识符,它设置,终止计时器并且您不再看到
WM_TIMER
消息较早启用 - 窗口线程正忙于(卡住)一些不包括消息调度的事件,所以计时器本身存在,健康且活跃,只是没有发送消息
要做的事情——还没有关于手头问题的额外信息:
- 检查窗口的线程和 Set/KillTimer 调用以确保它们一起有意义
- 使用 Spy++ 工具检查为您的窗口和/或感兴趣的线程发布的消息,以查明您是否真的缺少
WM_TIMER
,或者它们只是不要到达您的代码;你也可能会看到其他有趣的消息
关于c++ - WM_TIMER 在 ATL ActiveX 控件中突然停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690899/