SetTimer函数和WM_TIMER消息是Win32 api中最基本的玩意儿了,任何初学Win32 api编程的人都应该对此很熟悉吧。在这篇文章中,让我们来深入了解一下和SetTimer相关的使用和应用。
UINT_PTR SetTimer(
HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
我们经常使用的情况是hWnd不为NULL,lpTimerFunc为NULL,在这种情况下系统每隔nIDEvent毫秒会向hWnd窗口投递WM_TIMER消息。唯一需要注意的是:
1.自2000起,uElapse范围是USER_TIMER_MINIMUM到USER_TIMER_MAXIMUM。超出得话,uElapse设置为1。
2.WM_TIMER消息其实是在DispatchMessage函数中直接调用hWnd的窗口过程,并且优先级很低,只有在消息队列中没有其它消息的情况下,DispatchMessage才会考虑WM_TIMER。
3.使用相同的nIDEvent可以重置这个Timer,并且KillTimer(hWnd,nIDEvent)来销毁这个Timer。
我们再来考虑hWnd为NULL的情况:
1.首先,最重要的是KillTimer时,传入的Timer Id必须是SetTimer的返回值,而不是调用SetTimer时传入的nIDEvent参数。
2.调用SetTimer时,如果nIDEvent为0或者是其它没有被使用的Timer Id,则SetTimer会返回一个新的Timer Id。否则,就是重新设置这个Timer。
3.如果有lpTimerFunc的话,则lpTimerFunc的参数nIDEvent是SetTimer返回的值,而不是你调用SetTimer时传入的值。
最后看一下lpTimerFunc不为NULL的情况:lpTimerFunc会在DispatchMessage函数中被直接调用,而不会去调用hWnd的窗口过程(也就是说收不到这个消息),无论hWnd是不是NULL。(这里,msdn中貌似有点问题,SetTimer的Remark部分说lpTimerFunc会在默认窗口中被调用,而WM_TIMER中说lpTimerFunc在DispatchMessage中被调用)
应用
使用lpTimerFunc可以做一个延时的操作,或者把某些操作推迟到下一个消息循环,而不需要为窗口定义一个新的Timer Id。
例如,我很喜欢这样写:
struct _DATA
{
//....
};
void CALLBACK TimerProc(HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime)
{
_DATA * data = (_DATA*)idEvent;
KillTimer(hwnd,idEvent);
//do something
free(data);
}
_DATA * data = (_DATA*)malloc(sizeof(_DATA));
SetTimer(AfxGetMainWindow()->m_hWnd,(UINT_PTR)data,10,&TimerProc);
首先,使用了TimerProc,不会使窗口收到WM_TIMER消息,那样可以使用idEvent来传递自定义数据而不会和窗口自己使用的Timer id冲突。
其次,第一个参数hWnd不能为NULL,否则TimerProc的idEvent参数就不是你传入的自定义数据了。
最后,msdn说SetTimer不能跨线程使用,所以最好不要用这样的方法在向ui线程来插入代码,还是老老实实的发消息吧。
本文转自 ☆★ 包罗万象网 ★☆ - http://www.baoluowanxiang.com 转载请注明出处,侵权必究!
原文链接:http://www.baoluowanxiang.com/a/program/assembler/2010/0523/888.html
分享到:
相关推荐
C# SetTimer() KillTimer() 演示 调用系统user32进行计时并输出,时长为1秒。10秒钟后自动停止。
使用win32 api 的SetTimer函数定义一个定时器,每隔10毫秒改变窗口客户区的颜色;窗口过程在处理WM_TIMER消息时,改变颜色的值;窗口过程在处理WM_PAINT消息时,使用设定好的颜色填充窗口客户区。
基本网上很多定时器都是用MFC写的,而用win32方面比较少,项目用到定时器这块,所以顺便上传一份. 是在VS2010 --> VC++ --> Win32控制台建的工程.里面涉及线程/定时器,简单易用,下载完可直接运行.
怎么往SetTimer的回调函数传递参数
定时器事件的响应函数,即 VOID CALLBACK TimerProc() 不是由用户程序自己调用的,而是根据时钟事件借由操作系统内核调用的;那么,如何利用这些形式参数,传递程序逻辑处理所需要的参数呢?本文给出一个解决方案,...
使用Win32 API模拟了SetTimer以及KillTimer的行为,不需要将定时器绑定到窗口句柄上面,同时可以为定时器回调函数传递参数信息。
线程内使用SetTimer实现定时器 代码中MyThreadTimer时线程定时器的实现
vc++2005定时器settimer()的使用 查了一些资料,写了个简单的程序
MFC 使用定时器的示例. 1,选择Dialog视图,右击选择“事件”. 2,选择“新建Windows消息/事件(N)”列表,添加WM_TIMER到右侧列表内。 3,cpp会自动生成 ...4,使用SetTimer启动定时器. 5,使用KillTimer取消定时器.
SetTimer函数的用法,很实用看看就知道了。
本示例重点是演示SetTimer函数和KillTimer函数的使用,示例非常简单,相信入门者也能看得懂的。
VC++定时器,比SetTimer更精确
易语言WIN32程序设计之时钟源码,WIN32程序设计之时钟,GetModuleHandle,DialogBoxParam,ExitProcess,LoadIcon,SendDlgItemMessage,MessageBeep,SetTimer,KillTimer,EndDialog,GetDlgItemInt,SetDigItemInt
这一份代码是实现MFC的窗口创建完成需要立刻对某些控件进行响应,以及如何使用SetTimer和KillTimer的例子。 因为在MFC的初始化函数中,窗口创建还没有完成不能对窗口上的控件进行初始化操作,这是需要调用OnCreate...
下面的代码实现每1/10秒在屏幕上输出字符'a',在vc6与vs2008下调试通过。在vc6下直接可以运行,05或08下按照注释的地方改下就可以了
C# SetTimer() KillTimer() 演示 调用系统user32进行计时并输出,时长为1秒。10秒钟后自动停止。 PS:网上没一个能用的源码,结果研究了半天才搞明白。 看到好多人说不能用,应该不会吧,我亲自写出来试过的。我的...
- Count of processors (Win32/Tinba - Win32/Dyre) - Sandbox known product IDs (todo) - Color of background pixel (todo) - Keyboard layout (Win32/Banload) (todo) ### Anti-Virtualization / Full-System ...
用MFC中的SetTimer、OnTimer和KillTimer实现的计时器与倒计时的简单Demo。开发工具为VS2010。 MFC中的OnTimer()函数用于实现定时控制功能,定时控制功能主要由下面三个函数共同实现: SetTimer, KillTimer()和...
在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了。如果需要精度更高一些的定时器(精确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的...
VC MFC Socket编程,这里面不至一个例子,最后做出了一个简单的MFC Socket 聊天室例子,来进一步演示MFC Socket编程的技术细节,对于VC 初学者是非常不错的参考范例。 CDialog::OnInitDialog(); CSocket sock...