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。

 

原文地址:https://www.cnblogs.com/xuankuwa/p/3660288.html