Первый HWND hwnd и есть дескриптор создаваемого окна. Можно понаделать HWND hwnd1 = CreateWindow(... HWND hwnd2 = CreateWindow(... HWND hwnd3 = CreateWindow(... WndProc - это callback фукнкция. Окно работает в ином потоке чем сама программа. Тот поток смотрит что за действия были сделаны и потом посылает сообщение, грубо говоря делает так int num_of_windows = GetNumOfCreatedWindows(); // 3 окна мы сделали for( int i = 0; i < num_of_windows; ++i ){ HWND hWnd = GetCreatedWindowById( i ); if( GetWindowMessage( hWnd ) ){ // если есть какое сообщение WndProc( hWnd, 1, 0, 0 ); // посылаем какое-то сообщение в программу } } ============================= В самой функции можно написать тут hwnd = параметр LONG WINAPI WndProc(HWND hwnd;, UINT Message, WPARAM wparam, LPARAM lparam) { if( hwnd == hWnd1 ) printf( "Это первое окно
" ); if( hwnd == hWnd2 ) printf( "Это второе окно
" ); if( hwnd == hWnd3 ) printf( "Это третье окно
" ); }
Почитай про область видимости переменных, есть глобальные переменные, есть локальные. Из функции WinMain() вторую перемененную hwnd из WinProc() не видно и наоборот. Следовательно, локальные переменные из разных функций модно называть одним и тем же именем. Всё остальное нельзя. (С приставкой static это уже отдельная тема)
Это абсолютно разные переменные, переменную в С++ нельзя объявить дважды.
Прежде чем лезть в Windows API стоит изучить основы С\С++.
Изучи материал про область видимости переменных, существуют глобальные и локальные переменные. Из функции WinMain() вторую перемененную hwnd смотря на WinProc() не видно и наоборот. Следовательно, локальные переменные из разных функций модно называть одним и тем же именем.