.data
msgbuf MSG <>
.code
call setup ; *** user defined setup ***
msg_loop:
push large 0 ; uMsgFilterMax
push large 0 ; uMsgFilterMin
push large 0 ; hWnd (filter), 0 = all windows
push offset msgbuf ; lpMsg
call GetMessage ; returns FALSE if WM_QUIT
or eax,eax
jz end_msg_loop
call dispatch_message ; *** user defined dispatch ***
jmp msg_loop
end_msg_loop:
call cleanup ; *** user defined cleanup ***
If there are no messages waiting in the message queue, GetMessage
returns control to Windows. This frees up the CPU, allowing it to
be used by other programs. Alternatively, we can say that
GetMessage gives up the program's time slice, the
maximum amount of time given to the program before preemption.
All this allows the whole system to be more responsive than
otherwise.
The dispatch message code for a basic GUI app is:
dispatch_message:
push offset msgbuf
call TranslateMessage
push offset msgbuf
call DispatchMessage
ret
The call to TranslateMessage checks for keyboard messages and, on
some combinations of messages, adds WM_CHAR messages to the
message queue. (What a surprise -- WM_CHAR is not a
keyboard message!) We show the dispatch code as a subroutine, but
this short sequence is usually inlined, which eliminates the
call-ret overhead.
dispatch_message:
mov eax,msgbuf.msg_message
cmp eax,WM_APP+0
je on_app_message0
cmp eax,WM_APP+1
je on_app_message1
ret