http://www.cpp.atfreeweb.com/ConsoleTimer.html
The following console program works. It sets a timer using SetTimer then loops in a message loop. The message loop receives and processes WM_TIMER messages and the timer callback also is called for each time interval.#define STRICT 1 
#include <windows.h>
#include <iostream.h>VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
cout << "Time: " << dwTime << '\n';
cout.flush();
}int main(int argc, char *argv[], char *envp[]) {
int Counter=0;
MSG Msg;
UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc);
cout << "TimerId: " << TimerId << '\n';
if (!TimerId)
return 16;
while (GetMessage(&Msg, NULL, 0, 0)) {
++Counter;
if (Msg.message == WM_TIMER)
cout << "Counter: " << Counter << "; timer message\n";
else
cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
DispatchMessage(&Msg);
}
KillTimer(NULL, TimerId);
return 0;
}
I wrote this program after reading MS KB article Q102482 - INFO: SetTimer() Should Not Be Used in Console Applications which says that SetTimer() in a console application requires a separate thread. The Under The Hood article in the March 1997 issue of MSJ has a couple of sample console programs very similar to mine above. Like mine, they use SetTimer() without a separate thread.