2

创建窗口后,我启动了一个计时器来做某事。像这样的代码:

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

我追踪了最后一个错误,即 0。但我无法接收 wm_timer!像这样的代码:

case WM_TIMER:
{
     //...
}

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

PS 好吧,我提供了更多代码,它是一个 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;
.......
}
4

3 回答 3

2

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

于 2012-12-26T23:30:06.830 回答
1

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

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

我没有看到任何其他原因导致这应该发生故障。

于 2012-12-16T10:21:44.287 回答
0

我也有同样的问题。如果我将“ 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;
    }
于 2014-08-03T02:58:02.193 回答