zoukankan      html  css  js  c++  java
  • 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。

     

  • 相关阅读:
    网址
    123
    工具安装
    博客专栏-计算机网络
    JQuery(1)
    HTML常用标签
    Spring的线程池技术:ThreadPoolTaskExecutor
    Error:java: 程序包lombok不存在- IDEA+maven+lombok
    Andriod Studio中新创建的xml布局文件无法在R.layout中调用
    SAST : Single-Shot Arbitrarily-Shaped Text Detector论文阅读笔记
  • 原文地址:https://www.cnblogs.com/xuankuwa/p/3660288.html
Copyright © 2011-2022 走看看