控制台用SetTimer问题
Code1:
- C/C++ code
#include <stdio.h>#include <windows.h>#define ID_TIMER 0VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD);int main(int argc, char * argv[]){ int ch = 0; int iId; iId = SetTimer(NULL, ID_TIMER, 3000, TimerProc); printf("Enter 'q' quit!\n"); while(ch != 'q') { scanf("%c", &ch); } KillTimer(NULL, iId); return 0;}VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTimer){ MessageBox(NULL, "Hello World!", "Test", MB_OK);}
Code2:
- C/C++ code
#include <stdio.h>#include <windows.h>#define ID_TIMER 0VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD);int main(int argc, char * argv[]){ int ch = 0; int iId; iId = SetTimer(NULL, ID_TIMER, 3000, TimerProc); printf("Enter 'q' quit!\n"); while(1) { Sleep(1000); } KillTimer(NULL, iId); return 0;}VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTimer){ MessageBox(NULL, "Hello World!", "Test", MB_OK);}
我在控制台下用SetTimer,刚开始写的Code1,不弹MessageBox,我以为是scanf那里暂停了,后来我改成了Code2,还是不弹啊?怎么搞?请指教
[解决办法]
你的 ID_TIMER =0SetTimer的函数原型如下:
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ) ;
其中
hWnd是和timer关联的窗口句柄,此窗口必须为调用SetTimer的线程所有;如果hWnd为NULL,没有窗口和timer相关联并且nIDEvent参数被忽略
nIDEvent是timer的标识,为非零值;如果hWnd为NULL则被忽略;如果hWnd非NULL而且与timer相关联的窗口已经存在一个为此标识的timer,则此次SetTimer调用将用新的timer代替原来的timer。timer标识和窗口相关,两个不同的窗口可以拥有nIDEvent相同的tiemr
uElapse是以毫秒指定的计时间隔值,范围为1毫秒到4,294,967,295毫秒(将近50天),这个值指示Windows每隔多久时间给程序发送WM_TIMER消息。
lpTimerFunc是一个回调函数的指针,俗称TimerFunc;如果lpTimerFunc为NULL,系统将向应用程序队列发送WM_TIMER消息;如果lpTimerFunc指定了一个值,DefWindowProc将在处理WM_TIMER消息时调用这个lpTimerFunc所指向的回调函数,因此即使使用TimerProc代替处理WM_TIMER也需要向窗口分发消息。
关于SetTimer的返回值:如果hWnd为NULL,返回值为新建立的timer的ID,如果hWnd非NULL,返回一个非0整数,如果SetTimer调用失败则返回0
[解决办法]
SetTimer需要消息处理来调用你指定的响应函数( DefWindowProc ),所以 如果你的程序中没有消息处理 那就不会调用相关函数
找到个资料 你看看
http://blog.163.com/tangmin927@126/blog/static/31537494200961534820781/
[解决办法]
响应timer需要楼主自己写消息循环