第6章 定时器和windows时间

1 定时器

相关api

//设置定时器
SetTimer
UINT SetTimer(
    HWND hWnd,  // handle of window for timer messages
    UINT nIDEvent,  // timer identifier
    UINT uElapse,   // time-out value
    TIMERPROC lpTimerFunc   // address of timer procedure 当为NULL时会向窗口发送VM_TIMER消息
   );

WM_TIMER 消息的附加参数
wTimerID = wParam;            // timer identifier 
tmprc = (TIMERPROC *) lParam; // address of timer callback 
 

//撤销定时器
KillTimer
BOOL KillTimer(
    HWND hWnd,  // handle of window that installed timer
    UINT uIDEvent   // timer identifier
   );   
 

源代码
Timer.rc

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include        <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define DLG_MAIN        1
#define ICO_1           1
#define ICO_2           2
#define IDC_SETICON     100
#define IDC_COUNT       101
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义了两个icon
ICO_1   ICON        "1.ico" //对话框的图标,会取第一个ICON
ICO_2   ICON        "2.ico"


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义一个对话框 name DIALOG x,y,w,h
DLG_MAIN DIALOG 50, 50, 113, 40
//对话框的style
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "定时器例子" //对话框标题
FONT 9, "宋体" //对话框字体 
{
 ICON ICO_1, IDC_SETICON, 8, 9, 18, 21
 LTEXT "计数:", -1, 35, 16, 25, 10
 LTEXT "", IDC_COUNT, 62, 16, 40, 10
}

汇编代码
Timer.asm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 罗云彬, http://www.win32asm.com.cn
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Timer.asm
; 定时器的使用例子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Timer.asm
; rc Timer.rc
; Link /subsystem:windows Timer.obj Timer.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include     windows.inc
include     user32.inc
includelib  user32.lib
include     kernel32.inc
includelib  kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_TIMER1   equ 1
ID_TIMER2   equ 2
ICO_1       equ 1
ICO_2       equ 2
DLG_MAIN    equ 1
IDC_SETICON equ 100
IDC_COUNT   equ 101
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
hInstance   dd      ?
hWinMain    dd      ?
dwCount     dd      ?
idTimer     dd      ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定时器过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcTimer  proc    _hWnd,_uMsg,_idEvent,_dwTime
        
        PUSHAD ;将通用寄存器压栈 入栈顺序为EAX,ECX,EDX,EBX,ESP(初始值),EBP,ESI,EDI.
        invoke  GetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE
        ; GetDlgItemInt 获取对话框指定控件文本,将其转换为整数
        ;UINT GetDlgItemInt(
        ;    HWND hDlg, // handle to dialog box
        ;    int nIDDlgItem,    // control identifier
        ;    BOOL *lpTranslated,    // points to variable to receive success/failure indicator
        ;    BOOL bSigned   // specifies whether value is signed or unsigned
        ;   );
        inc eax
        invoke  SetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE
        ;BOOL SetDlgItemInt(
        ;    HWND hDlg, // handle of dialog box
        ;    int nIDDlgItem,    // identifier of control
        ;    UINT uValue,   // value to set
        ;    BOOL bSigned   // signed or unsigned indicator
        ;   );
        POPAD ;将通用寄存器恢复
        ret

_ProcTimer  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam

        mov eax,uMsg
;********************************************************************
        .if eax ==  WM_TIMER 
            ;处理WM_TIMER
            ;WM_TIMER 消息的附加参数
            ;wTimerID = wParam;            // timer identifier 
            ;tmprc = (TIMERPROC *) lParam; // address of timer callback 
            ;
            mov eax,wParam ;将定时器ID放入eax
            .if eax ==  ID_TIMER1 ;若是第1个定时器
                inc dwCount ;dwCount加1
                ;取dwCount的第1位 0/1
                mov eax,dwCount
                and eax,1 ;eax=0 or 1
                inc EAX ;eax=1 or 2 对应ICO_1 ICO_2
                invoke  LoadIcon,hInstance,EAX ;加载icon
                ;修改ICON控件IDC_SETICON的图标
                invoke  SendDlgItemMessage,hWnd,IDC_SETICON,STM_SETIMAGE,IMAGE_ICON,EAX
                ;LONG SendDlgItemMessage(
                ;    HWND hDlg, // handle of dialog box
                   ; int nIDDlgItem,    // identifier of control
                   ; UINT Msg,  // message to send
                   ; WPARAM wParam, // first message parameter
                   ; LPARAM lParam  // second message parameter
                   ;);
                ;STM_SETIMAGE消息的附带参数
                ;wParam = (WPARAM) fImageType;       // image-type flag IMAGE_ICON/IMAGE_BITMAP/...
                ;lParam = (LPARAM) (HANDLE) hImage;  // handle of the image
            .elseif eax ==  ID_TIMER2 ;若是第2个定时器
                invoke  MessageBeep,-1 ;调用蜂鸣器
            .endif
;********************************************************************
        .elseif eax ==  WM_INITDIALOG ;窗口初始化时
            push    hWnd
            pop hWinMain ;将hWnd赋值给hWinMain
            invoke  SetTimer,hWnd,ID_TIMER1,250,NULL ;创建定时器ID_TIMER1 周期为250ms
            invoke  SetTimer,hWnd,ID_TIMER2,2000,NULL ;创建定时器ID_TIMER2 周期为2s
            invoke  SetTimer,NULL,NULL,1000,addr _ProcTimer ;创建定时器ID_TIMER3 周期为1s 定时器回调函数为_ProcTimer
            mov idTimer,EAX ;将第3个定时器的id保存至idTimer
;********************************************************************
        .elseif eax ==  WM_CLOSE
            ;在窗口退出之前撤销3个定时器
            invoke  KillTimer,hWnd,ID_TIMER1
            invoke  KillTimer,hWnd,ID_TIMER2
            invoke  KillTimer,NULL,idTimer
            ;结束对话框
            invoke  EndDialog,hWnd,NULL
;********************************************************************
        .else
            mov eax,FALSE
            ret
        .endif
        mov eax,TRUE
        ret

_ProcDlgMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke  GetModuleHandle,NULL
        mov hInstance,eax
        invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
        invoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end start

Makefile

NAME = Timer
OBJS = $(NAME).obj
RES  = $(NAME).res

LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff

$(NAME).exe: $(OBJS) $(RES)
    Link $(LINK_FLAG) $(OBJS) $(RES)

.asm.obj:
    ml $(ML_FLAG) $<
.rc.res:
    rc $<

clean:
    del *.obj
    del *.res

2 windows时间

2.1 windows时间的获取和设置

GetLocalTime SYSTEMTIME
GetSystemTime

2.2 计算时间间隔

GetTickCount

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容