invoke postquitmessage,null
.elseif umsg==wm_char
push wparam
pop char
invoke invalidaterect, hwnd,null,true
.elseif umsg==wm_paint
invoke beginpaint,hwnd, addr ps
mov hdc,eax
invoke textout,hdc,0,0,addr char,1
invoke endpaint,hwnd, addr ps
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret
.endif
xor eax,eax
ret
wndproc endp
end start
分析:
char wparam 20h ; the character the program receives from keyboard
这个变量将保存从键盘接收到的字符。因为它是在窗口过程中通过wparam型变量传送的,所以我们简单地把它定义为wparam型。由于我们的窗口在初次刷新时(也即刚被创建的那一次)是没有键盘输入的所以我们把他设成空格符(20h),这样显示时您就什么都看不见。
.elseif umsg==wm_charpush wparam
pop char
invoke invalidaterect, hwnd,null,true
这一段是用来处理wm_char消息的。它把接收到的字符放入变量char中,接着调用invalidaterect,而invalidaterect使得窗口的客户区无效,这样它会发出wm_paint消息,而wm_paint消息迫使windows重新绘制它的客户区。该函数的语法如下:
invalidaterect proto hwnd:hwnd,\
lprect:dword,\