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

标签 c++ windows activex atl

我最初有一个 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/

相关文章:

c++ - 递归代码的运行时错误

c++ - 从 native 应用程序访问 chrome 中的 DOM

activex - 如何从 SAP 调用 ActiveX?

c++ - Qt ActiveX 动态调用返回值始终为空

c++ - nrf51882a 入门

c++ - C++ 中的继承和模板

c++ - 在实现抽象类的类中定义额外的实现特定函数

c++ - NetBeans C++ 8.0.2 输出中这些消息的含义是什么?

c++ - Microsoft 推荐使用哪种 native API 来渲染 2D 图形?

c# - 将 WinForms UserControl 公开为 ActiveX 控件