Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Кафедра
інформаційних
систем та мереж
Лабораторна робота №10
на тему
ПРОГРАМУВАННЯ ДЛЯ WINDOWS З ВИКОРИСТАННЯМ ФУНКЦІЙ WIN32 API
Львів – 2009
Текст програми на асемблері:
.386 ; для процесора не нижче INTEL-386
.model flat,STDCALL ; компілювати як програму для WIN32
; Визначення зовнішніх процедур:
extrn GetModuleHandleA:Proc ; отримання дескриптора модуля програми
extrn RegisterClassA:Proc ; реєстрація віконного класу
extrn CreateWindowExA:Proc ; створення вікна
extrn GetMessageA:Proc ; читання повідомлень з черги
extrn TranslateMessage:Proc ; перетворення повідомлень клавіатури
extrn DispatchMessageA:Proc ; спрямування повідомлень у процедуру
; опрацювання
extrn DefWindowProcA:Proc ; опрацювання повідомлень за замовчуванням
extrn MessageBoxA:proc ; виведення вікна повідомлень
extrn GetDC:Proc ; отримання дескриптора контексту пристрою
extrn ReleaseDC:Proc ; звільнення контексту пристрою
extrn TextOutA:Proc ; виведення тексту у вікно програми
extrn lstrlen:Proc ; визначення довжини рядка
extrn ExitProcess:Proc ; вихід з програми
extrn GetComputerNameA :proc ; Отримання імені комп'ютера.
extrn GetUserNameA :proc ; Отримання імені користувача.
; властивості вікна
CS_VREDRAW equ 1h ; перемальовувати вікно при зміні вертикального
CS_HREDRAW equ 2h ; та горизонтального розміру
; стилі вікна
WS_OVERLAPPED equ 00000000h ; вікно, що перекривається
WS_MAXIMIZEBOX equ 00010000h ; кнопка максимізації
WS_MINIMIZEBOX equ 00020000h ; кнопка мінімізації
WS_THICKFRAME equ 00040000h ; товста рамка
WS_SYSMENU equ 00080000h ; кнопка системного меню
WS_CAPTION equ 00C00000h ; наявність заголовка вікна
WS_VISIBLE equ 10000000h ; вікно видиме
WS_POPUP equ 80000000h ; вікно спливаюче
; повідомлення від клавіатури
WM_KEYDOWN equ 100h
WM_CHAR equ 102h
;повідомлення від миші
WM_LBUTTONDOWN equ 201h
WM_RBUTTONDOWN equ 204h
.data
buflen dd 256
buflen2 dd 256
user_name db 256 dup (0) ; Буфер заповнений нулями
login db 256 dup (0) ; Буфер заповнений нулями
WndClassName db 'MyClass',0 ; назва віконного класу
AppCaption db 'LABA_10',0 ; заголовок вікна
AppHWnd dd 0 ; дескриптор модуля програми
MainHWnd dd 0 ; дескриптор вікна
HDC dd 0 ; дескриптор контексту пристрою
label1 db "Ім'я компю'тера:",0
label2 db "Ім'я користувача:",0
; структура повідомлення
MSG:
msHWND dd 0 ; дескриптор вікна
msMESSAGE dd 0 ; номер повідомлення
msWPARAM dd 0 ; конкретизація повідомлення (залежить від
msLPARAM dd 0 ; виду повідомлення)
msTIME dd 0 ; час, коли надіслано повідомлення
ptX dd 0 ; X-координата курсора миші, коли надіслано повідомлення
ptY dd 0 ; Y- координата курсора миші, коли надіслано повідомлення
; структура віконного класу
MyWndClass:
style dd CS_HREDRAW or CS_VREDRAW ; прапорці властивостей вікна
fnWndProc dd offset WndProc ; адреса процедури опрацювання повідомлень
cbClsExtra dd 0 ; додаткові параметри класу вікна
cbWndExtra dd 0 ; додаткові параметри вікна
hInstance dd 0 ; дескриптор програми-власника вікна
hIcon dd 0 ; дескриптор піктограми вікна
hCursor dd 0 ; дескриптор курсора миші
hbrBackground dd 1 ; дескриптор фону вікна
szMenuName dd 0 ; дескриптор меню вікна
szClassName dd offset WndClassName ; адреса назви віконного класу
.code
START:
push 0
call GetModuleHandleA ; отримати дескриптор модуля програми
mov AppHWnd,eax
push offset MyWndClass ; адреса назви віконного класу
call RegisterClassA ; зареєструвати віконний клас у Windows
push 0 ; вказівник на MDI-структуру (або 0)
push AppHWnd ; дескриптор програми
push 0 ; дескриптор меню (або 0)
push 0 ; дескриптор вікна-власника (або 0)
push 300 ; висота вікна
push 500 ; ширина вікна
push 100 ; координата Х
push 100 ; координата Y
push WS_OVERLAPPED or WS_MAXIMIZEBOX or WS_MINIMIZEBOX or\
WS_THICKFRAME or WS_SYSMENU or WS_CAPTION or WS_VISIBLE or\
WS_POPUP ; стилі вікна
push offset AppCaption ; адреса назви вікна (або 0)
push eax ; вказівник на назву віконного класу
push 0 ; властивості вікна
call CreateWindowExA ; створити вікно
mov MainHWnd,eax
;---------------
push offset buflen ; 2-й параметр: адреса buflen
push offset user_name ; 1-й параметр: адреса user_name
call GetComputerNameA ; виклик функції API
push offset buflen2 ; 2-й параметр: адреса buflen
push offset login ; 1-й параметр: адреса user_name
call GetUserNameA ; виклик функції API
;--------------
; цикл опрацювання повідомлень
MSG_LOOP:
call GetMessageA, offset MSG, MainHWnd, 0, 0 ; читати всі повідомлення від вікна
cmp msWPARAM,1bh ; клавіша ESQ
jz _exit
call TranslateMessage, offset MSG ; перетворювати низькорівневі повідомлення
call DispatchMessageA,offset msg ; направляти повідомлення у
jmp MSG_LOOP
_exit: call ExitProcess,0
; процедура опрацювання повідомлень
WndProc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
call GetDC, hwnd
mov HDC,eax
call lstrlen,offset label1
call TextOutA, HDC, 10, 30, offset label1, eax
call ReleaseDC,hwnd,HDC
call GetDC, hwnd
mov HDC,eax
call lstrlen,offset user_name
call TextOutA, HDC, 10, 45, offset user_name, eax
call ReleaseDC,hwnd,HDC
call GetDC, hwnd
mov HDC,eax
call lstrlen,offset label2
call TextOutA, HDC, 10, 80, offset label2, eax
call ReleaseDC,hwnd,HDC
call GetDC, hwnd
mov HDC,eax
call lstrlen,offset login
call TextOutA, HDC, 10, 95, offset login, eax
call ReleaseDC,hwnd,HDC
call DefWindowProcA,hwnd,wmsg,wparam,lparam
ret
WndProc endp
END START
Висновки: виконавши дану лабораторну роботу я навчився використовувати функції Win32 API при програмуванні в операційній системі Windows.