WIN32汇编语言教程:第06章 定时器 · 6.3 取Windows时间

很多读者看到“定时器”这个词的时候往往就联想到时钟,笔者也曾是如此,但是经过6.2节的介绍后就可以发现,定时器是不能用来构造时钟的,定时器用于时钟程序中只能是用在定时刷新屏幕这个功能上,要得到系统的时间还是要靠别的方法。

在Win32编程中,和获取系统时间相关的函数有3个:

   invoke GetLocalTime,lpSystemTime
   invoke GetSystemTime,lpSystemTime
   invoke GetTickCount

它们之间的区别是:

GetTickcount返回的是本次Windows启动以来的ms数,得到的时间数值直接在eax中返回,由于这是一个32位的整数,可以表示的范围是1~ffffffffh ms,所以当Windows连续运行49.7天以后,计数器会清零并重新开始。

GetLocalTime返回当前的时间,GetSystemTime返回当前的格林威治标准时间,这两个函数返回的时间数据包括年、月、日、时、分、秒、毫秒以及星期,数据比较多,所以无法放在eax中返回,应用程序需要预先设置一个SYSTEMTIME结构的缓冲区,并将缓冲区地址lpSystemTime当参数传递给函数,函数会把时间数据返回到这个缓冲区中。

SYSTEMTIME结构的定义如下:

SYSTEMTIME STRUCT
 wYear            WORD   ? ;年
 wMonth           WORD   ? ;月
 wDayOfWeek       WORD   ? ;星期,0=星期日,1=星期一,......
 wDay             WORD   ? ;日
 wHour            WORD   ? ;时
 wMinute          WORD   ? ;分
 wSecond          WORD   ? ;秒
 wMilliseconds    WORD   ? ;毫秒
SYSTEMTIME ENDS

需要注意的是,结构中的字段全部是word类型的,而Win32程序中用的往往是dword型变量,所以在使用这些数据之前往往要先把它们转换为dword类型,用movzx指令就可以很方便地完成这个工作,如movzx eax,stSystemTime.wYear将wYear字段扩展到32位后放到eax中。

和获取系统时间的函数相对应,可以用下面的两个函数设置系统时间:

invoke SetLocalTime,lpSystemTime
invoke SetSystemTime,lpSystemTime

同样,SetLocalTime中的参数代表本地时间,SetSysTime中的参数代表格林威治标准时间,在调用函数之前,要把需要设置的时间放到一个SYSTEMTIME结构中并把结构地址当做参数传递给Windows。

上页:第06章 定时器 · 6.2 定时器的使用(2) 下页:第07章 图形操作 · 7.1 GDI原理(1)

第06章 定时器

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号