Ciao
Secondo me è sbagliata l'impostazione del programma: i messaggi non vanno analizzati all'interno del message loop, ma all'interno del WndProc associato alla classe della finestra. Devi fare quindi una cosa di questo genere:
//il message loop:
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//La WndProc associata alla finestra
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
//-- necessario altrimenti il messaggio
//continua ad essere chiamato --
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
//-- --
printf("painting\r\n");
break;
//Command
case WM_COMMAND:
//Comando inviato da un child control
if(lParam != 0)
{
//LOWORD(wParam) è l'identificatore del child control
//cioè il valore che passi a CreateWindow come HMENU
//per identificare i diversi controlli dai diversi valori
//nella chiamata a CreateWindow
switch(HIWORD(wParam))
{
case BN_CLICKED:
printf("A Button was clicked! The button id is %i\r\n", LOWORD(wParam));
break;
}
}
//Comando generato da un Menu o un Acceleratore
else
{
switch(HIWORD(wParam))
{
case 0:
//Menu
//LOWORD(wParam) è l'identificatore del menu
break;
case 1:
//Accelerator
//LOWORD(wParam) è l'identificatore dell'acceleratore
break;
}
}
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Per riconoscere i bottoni uno dall'altro quando ricevi il WM_COMMAND devi dare diversi identificatori ai bottoni. L'identificatore viene assegnato al controllo (per i child controls) quando crei il controllo con CreateWindow. Il numero di identificazione è il parametro hMenu, che deve essere un valore intero castato su HMENU.
Se non sono stato chiaro chiedi di nuovo 
Luca