窗口的創建過程:
1)。使用GetModulHandle獲取窗口句柄
GetModuleHandle,lpModuleName
獲取一個應用程序或動態鏈接庫的模塊句柄
lpModuleName參數是一個指向含有模塊名字字符串的指針
如果返回成功,則返回模塊句柄,存放在eax中。如果lpModuleName為NULL,則返回調用者本模塊的句柄
2)。注冊窗口類
定義一個WNDCLAS***結構類型的變量,對其進行賦值,在調用RegisterClas***函數在系統中注冊。
WNDCLAS***的結構定義如下:
WNDCLAS*** STRUCT
cbSize DWORD ? ;結構體的字節數我們可以用sizeof(WNDCLAS***)來獲得准確的值
style DWORD ? ;窗口風格
lpfnWndProc DWORD ? ;窗口過程的地址
cbCl***tra DWORD ? ;緊跟在窗口類結構後邊的字節數
cbWndExtra DWORD ? ;緊跟在窗口事例後的附加字節數
hInstance DWORD ? ;本模塊的事例句柄
hIcon DWORD ? ;圖標的句柄
hCursor DWORD ? ;光標的句柄
hbrBackground DWORD ? ;背景色
lpszMenuName DWORD ? ;指向類名稱的指針
hIconSm DWORD ? ;小圖標
WNDCLAS*** ENDS
RegisterClas*** lpClassName
lpClassName參數是窗口類的地址
3)。建立窗口
CreateWindowEx, dwExstyle, lpClassName, lpWindowName, dwStyle,\
x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam
dwExstyle和dwStyle決定了窗口的外形和行為,dwStyle是win16開始就有點的屬性,dwExstyle是win32中擴展的。
lpClassName:建立窗口使用的類名字符串指針。
lpWindowName:指向窗口名稱的字符串。會顯示在標題欄中。
x,y:指向窗口左上角位置,單位是像素
nWidth, nHeight:窗口的寬度和高度,單位是像素。
hWndParent:父窗口的句柄,若無父窗口,則為NULL
hMenu:窗口上要出現菜單的句柄。
hInstance:模塊句柄,指定了窗口所屬的程序模塊。
lpParam:指針,指向一個欲傳給窗口的參數
4)。消息循環
;>>>>>>>>>消息循環
.while TRUE
invoke GetMessage, addr @stMsg,NULL, 0, 0
.break .if eax == 0
invoke TranslateMessage, addr @stMsg
invoke DispatchMessage, addr @stMsg
.endw
GetMessage:從消息隊列中取出一條消息,准備處理
TranslateMessage:遇到鍵盤消息則將掃描碼轉換成ASCII碼,否則不處理
DispatchMessage:將消息發送到窗口對應的窗口過程去處理。
窗口過程
WindowProc proc uses ebx edi esi, hWnd, uMsg, wParam, lParam
mov eax, uMsg
.if eax == WM_XXX
<處理WM_XXX消息>
.elseif eax == WM_YYY