【问题标题】:my app cannot receive wm_timer msg我的应用无法接收 wm_timer 消息
【发布时间】:2014-08-03 11:11:43
【问题描述】:

创建窗口后,我启动了一个计时器来做某事。代码如下:

SetTimer(hWnd, 1, 40, NULL);  //tick each 40 ms.

我追踪了最后一个错误,它是 0。但我无法接收 wm_timer!代码如下:

case WM_TIMER:
{
     //...
}

我的IDE是VS2010,操作系统是Windows7,请问我使用的环境有什么特殊情况吗?

附:好吧,我提供更多代码,它是一个 win32 应用程序,所以在 WinMain 中:

HWND hWnd = CreateWindow(...);  //style : WS_POPUP | WS_VISIBLE , return is good
SetTimer(hWnd, 1, 40, NULL);    //return is good too.
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

和 WndProc:

switch(message)
{
case WM_TIMER:
{
    DebugBreak();  //no reaction
}
break;
.......
}

【问题讨论】:

  • 是的,这是1.良好的回报。
  • 您需要发布更多代码。如何设置 WndProc 以及在何处启动计时器。
  • 另外,创建窗口和计时器的线程中是否有消息循环运行?
  • 你做错了什么。为了了解它是在生成定时器消息之前,还是生成它们但未能正确处理,请使用Spy++ SDK 工具检查您的窗口消息并找出是否存在定时器消息。

标签: windows winapi


【解决方案1】:

WM_TIMER 如果您未能使用其他消息,则不会触发,因为它们将优先处理。例如,其中一个原因是未正确处理 WM_PAINT 消息(您必须 BeginPaint() / EndPaint()

【讨论】:

  • 你明白了! WM_PAINT 消息总是在发送,所以我无法接收 WM_TIMER,哈哈。
【解决方案2】:

据我所知,问题源于您过早调用 SetTimer。将它放在 WM_CREATE 中。

switch(message)
{
    case WM_CREATE:
    {
        SetTimer(hWnd, 1, 40, NULL);
    }
    case WM_TIMER:
    {
        DebugBreak();  //no reaction
    }
    break;
    .......
}

我看不出有什么其他原因会导致它发生故障。

【讨论】:

  • @KnowNothing 在这种情况下,您应该发布更多代码,例如整个主过程。必须有什么东西,这不是核物理:P
【解决方案3】:

我也有同样的问题。如果我将“SetTimer()”放在WM_CREATE 部分,它不会启动。但是,如果我创建一个需要单击的菜单选项,并将“SetTimer()”函数放在那里, 它有效。

  case WM_CREATE:
    {
        SetTimer(hWnd, 1, 1000, NULL); // does not work here
        return 0:
    }
    case ID_TIMER_START:
    {
       SetTimer(hWnd, 1, 1000, NULL); // works here
       return 0;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多