gpt4 book ai didi

c++ - WM_TIMER 在 ATL ActiveX 控件中突然停止

转载 作者:行者123 更新时间:2023-11-28 03:30:48 29 4
gpt4 key购买 nike

我最初有一个 ActiveX 控件,它注册了一个每隔几秒触发一次的 Windows 计时器(使用 SetTimer())。到目前为止效果很好。现在为了实现全屏模式,我向我的控件添加了一个子窗口,它应该显示内容,而控件本身管理所有 ActiveX 内容。

我在使用这种方法时遇到的问题是我的 WM_TIMER 在某个时候突然停止触发。我已经将其追溯到 UIDeactivate() 在我的控件上被调用,但我不知道为什么在未调用此方法时调用它(我相信它与失去焦点有关)之前。

我还想知道为什么我的 WM_TIMER 事件突然停止,而其他一切似乎仍然正常工作。它与在子窗口中而不是在 ActiveX 控件本身上显示内容有什么关系?

最佳答案

计时器停止是有原因的。这可能是:

  1. 您可以通过调用 KillTimer 来停止计时器
  2. 您的窗口已重新创建且计时器未重新启用
  3. 您的控件是无窗口的,您实际上没有HWND 句柄
  4. 计时器标识符发生冲突,那里有其他东西(例如内部子类窗口)使用相同的标识符,它设置,终止计时器并且您不再看到 WM_TIMER 消息较早启用
  5. 窗口线程正忙于(卡住)一些不包括消息调度的事件,所以计时器本身存在,健康且活跃,只是没有发送消息

要做的事情——还没有关于手头问题的额外信息:

  1. 检查窗口的线程和 Set/KillTimer 调用以确保它们一起有意义
  2. 使用 Spy++ 工具检查为您的窗口和/或感兴趣的线程发布的消息,以查明您是否真的缺少WM_TIMER,或者它们只是不要到达您的代码;你也可能会看到其他有趣的消息

关于c++ - WM_TIMER 在 ATL ActiveX 控件中突然停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690899/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com