Its worth keeping in mind that if and when you need to exit a WndProc style procedure for a normal CreateWindowEx() style window that you check the return value of the message that is being processed.
Some messages require that you return zero and this you do simply by the code sequence,
xor eax, eax ; set EAX to zero
ret
This bypasses the DefWindowProc. Apart from this you actually need to call DefWindowProc so that the default message processing occurs.
Just to make life confusing, when you have a dialog message handler, it MUST set EAX to zero then return. You exit a dialog with the API call, not the value in EAX or the trailing RET.