Есть несколько проблем с вашим кодом.
Во-первых, вы должны использовать GetMessage()
, а не PeekMessage()
. Принципиальное отличие состоит в том, что PeekMessage()
не является блокирующим, и, следовательно, ваша программа будет использовать 100% ЦП, на котором выполняется этот цикл.
Кроме того, поскольку внутренний цикл может проходить или не проходить по нескольким сообщениям встрока, проверка вещей во внешнем цикле, как вы делаете, будет хитом или промахом и не проверит все сообщения. Вместо этого вам следует проверять каждое сообщение во внутреннем цикле.
Но в этом случае это необязательно, поскольку этот цикл завершится, если окно все равно будет закрыто. Эта проверка, которую вы делаете, бессмысленна.
Есть несколько других несоответствий с вашим кодом, wc.hInstance
должно быть hInstance
, что вы получили в качестве параметра в WinMain()
. Нет необходимости искать эту информацию с помощью API.
Кроме того, CreateWindow()
должен снова получить hInstance
в качестве второго по значению параметра, а не nullptr
.
И, наконец, как указано chris 'answer , вы должны искать тип сообщения в msg.message
, а не в msg.wParam
.
В дополнение ко всему, здесь не место делать"Custom WindowProc". Если вы хотите создать пользовательский WndProc, вы должны установить wc.lpfnWndProc
для своей собственной функции вместо DefWindowProc
, и там вы можете определить свое поведение для своего окна.
Например:
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
case WM_DESTROY:
// do nothing
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Обратите внимание, что нет необходимости проверять WM_QUIT
, так как это сообщение будет появляться, только если ваше приложение вызывает PostQuitMessage()
.