win32汇编-定时器与取本地时间 (四)
.code ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 定时器过程 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _ProcTimer proc _hWnd,uMsg,_idEvent,_dwTime pushad invoke GetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE inc eax invoke SetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE popad ret _ProcTimer endp
创建\销毁及定时事件
.if eax == WM_TIMER mov eax,wParam .if eax == ID_TIMER1 inc dwCount mov eax,dwCount and eax,1 inc eax invoke LoadIcon,hInstance,eax invoke SendDlgItemMessage,hWnd,IDC_SETICON,\ STM_SETIMAGE,IMAGE_ICON,eax .elseif eax == ID_TIMER2 invoke MessageBeep,-1 .endif ;******************************************************************** .elseif eax == WM_INITDIALOG push hWnd pop hWinMain invoke SetTimer,hWnd,ID_TIMER1,250,NULL invoke SetTimer,hWnd,ID_TIMER2,2000,NULL invoke SetTimer,NULL,NULL,1000,addr _ProcTimer mov idTimer,eax
在Win32编程中,获取系统时间相关的函数有3个:
invoke GetLocalTime,lpSystemTime //返回当前的时间
invoke GetSystemTime,lpSystemTime //返回当前的格林威治标准时间
invoke GetTickCount //返回的是本次Windows启动以来的ms数
前两个函数返回的时间数据包括年、月、日、时、分、秒、毫秒以及星期,数据比较多,所以无法放在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
在调用函数之前,要把需要设置的时间放到一个SYSTEMTIME结构中并把结构地址当做参数传递给Windows。