2012-12-15 27 views
1

創建窗口後,我啓動了一個計時器來做某事。代碼是這樣的:我的應用程序無法接收wm_timer msg

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

我追溯了最後一個錯誤,它是0.但我無法接收wm_timer!像這樣的代碼:

case WM_TIMER: 
{ 
    //... 
} 

我的IDE是VS2010,而OS是Windows7的,所以有關於我的使用環境中的某些情況下調校妥當?

P.S.好吧,我提供更多的代碼,這是一個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; 
....... 
} 
+0

SetTimer返回> 0? – Jeroen

+0

是的,它是1.良好的回報。 – KnowNothing

+1

您需要發表更多的代碼。你如何設置你的WndProc和你啓動計時器的地方。 – Jeroen

回答

2

WM_TIMER如果您沒有使用其他消息,將不會觸發,因爲它們將優先。其中一個原因,例如,沒有正確處理WM_PAINT消息(您必須BeginPaint()/EndPaint()

+0

你懂了! WM_PAINT味精總是發送,所以我不能recv的WM_TIMER,哈哈。 – KnowNothing

0

要我的記憶中,這個問題從你放置的SetTimer呼叫的事實莖太早了。將它放在WM_CREATE中。

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

我沒有看到任何其他原因,這應該會發生故障。

+0

我試過了,但沒有奏效。 – KnowNothing

+0

@KnowNothing在這種情況下,您應該發佈一些更多的代碼,如整個主要過程。有些東西必須是博克,這不是核物理:P – mkey

0

我有同樣的問題。如果我在WM_CREATE部分中輸入「SetTimer()」,它不會啓動。但是,如果我創建了一個需要點擊的菜單選項,並將「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; 
    }