; [EBP+8]; HWND
WNDPROC PROC
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
;-----------------
CMP DWORD PTR [EBP+0CH],WM_CLOSE
JNE L1
; здесь реакция на закрытие окна
; удалить таймер 1
PUSH 1; идентификатор таймера
PUSH DWORD PTR [EBP+08H]
CALL KillTimer@8
; удалить таймер 2
PUSH 2; идентификатор таймера
PUSH DWORD PTR [EBP+08H]
CALL KillTimer@8
PUSH 0
PUSH DWORD PTR [EBP+08H]
CALL EndDialog@8
JMP FINISH
L1:
CMP DWORD PTR [EBP+0CH], WM_INITDIALOG
JNE L2
; здесь начальная инициализация
; установить таймер 1
PUSH 0; параметр = NULL
PUSH 1000; интервал 1 с.
PUSH 1; идентификатор таймера
PUSH DWORD PTR [EBP+08H]
CALL SetTimer@16
; установить таймер 2
PUSH OFFSET TIMPROC; параметр = NULL
PUSH 500; интервал 0.5 с.
PUSH 2; идентификатор таймера
PUSH DWORD PTR [EBP+08H]
CALL SetTimer@16
JMP FINISH
L2:
CMP DWORD PTR [EBP+0CH],WM_TIMER
JNE FINISH
; отправить строку в окно
PUSH OFFSET STRCOPY
PUSH 0
PUSH WM_SETTEXT
PUSH 1; идентификатор элемента
PUSH DWORD PTR [EBP+08H]
CALL SendDlgItemMessageA@20
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
MOV EAX,0
RET 16
WNDPROC ENDP
;--------------------------------
;процедура таймера
; расположение параметров в стеке
; [EBP+014Н]; LPARAM - промежуток запуска Windows
; [EBP+10Н]; WAPARAM - идентификатор таймера
; [EBP+0CH]; WM_TIMER
; [EBP+8]; HWND
TIMPROC PROC
PUSH EBP
MOV EBP,ESP
; получить локальное время
PUSH OFFSET DATA
CALL GetLocalTime@4
; получить строку для вывода даты и времени
MOVZX EAX,DATA.sec
PUSH EAX
MOVZX EAX,DATA.min
PUSH EAX
MOVZX EAX,DATA.hour
PUSH EAX
MOVZX EAX,DATA.year
PUSH EAX
MOVZX EAX,DATA.month
PUSH EAX
MOVZX EAX,DATA.day
PUSH EAX
PUSH OFFSET TIM
PUSH OFFSET STRCOPY
CALL wsprintfA
; восстановить стек
ADD ESP,32
RET 16
TIMPROC ENDP
_TEXT ENDS
END START
Результат выполнения программы
Результат выполнения программы
показан на рисунке 1.
Рисунок 1 - Результат выполнения программы
таймер windows winapi
Выводы
В процессе выполнения курсовой работы были получены теоретические сведения о таймерах Windows, для реализации программы было изучено 32-битное программирование, освоены такие программы, как MASM32(основной компилятор), MASM Builder(графическая оболочка MASM32), ResEdit(редактор ресурсов), OllyDBG(отладчик от стороннего разработчика). На основе полученных знаний с целью их закрепления была написана программа, выполняющая следующие основные действия:
· Выключение компьютера по нажатию на кнопку
· Перезагрузка компьютера по нажатию на кнопку
· Выключение компьютера по таймеру
· Перезагрузка компьютера по таймеру
· Вывод текущей даты и времени
· Вывод оставшегося времени до перезагрузки/выключения
·
Отображение сведений о программе