Я намерен создать небольшое приложение с двумя окнами, обычным окном с элементами управления и трехмерным окном, визуализированным с помощью DirectX. Для 3D окна PeekMessage()
рекомендуется, потому что он не ждет после проверки сообщений, но для обычных окон (без 3D-рендеринга) GetMessage()
Функция используется, чтобы избежать бессмысленного использования процессора.
Итак, когда 3D-окно активно (WM_ACTIVE
сообщение получено) хочу использовать PeekMessage()
и когда нормальное окно активно, я хочу использовать GetMessage()
,
Основной цикл будет выглядеть так:
NormalWindowActive = false;
Window3DActive = false;
MSG msg;
while (TRUE) {
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (NormalWindowActive) {
if (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} else {
RenderWindow();
}
}
В обработчике сообщений этих окон у меня есть WM_ACTIVATE
сообщение:
HWND NormalWindow, Window3D; // These windows are global vars
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
// ...
case WM_ACTIVATE:
if (wParam!= WA_INACTIVE) {
if (hWnd == NormalWindow) {
NormalWindowActive = true;
Window3DActive = false;
} else {
Window3DActive = true;
NormalWindowActive = false;
}
}
break;
// ...
}
Я ожидаю, что TaskManager покажет, что приложение занято (~ 50% использования процессора), когда 3D-окно активно, и не так занято, когда активно обычное окно (~ 5% загрузки процессора). Я вижу только 50% использования процессора, когда оба окна потеряли фокус, но я вижу 0-5% использования процессора, когда любое из них активно. Я считаю, что должна быть разница, поэтому я не уверен, действительно ли это работает (или даже возможно). Отображается трехмерное окно, и обычное окно тоже реагирует на события, но использование процессора смущает меня. Я просто не хочу, чтобы это влияло на FPS 3D-окна.
Вместо того, чтобы проверять, является ли нормальное окно активным, вы должны проверить, является ли 3D-окно неактивным. Вы также можете использовать WaitMessage
вместо GetMessage
потому что это спасает вас от дублирования кода.
Например:
if (Window3DActive)
RenderWindow();
else
WaitMessage();
Кажется, ваша проблема в том, что когда обычное окно неактивно, цикл обработки сообщений не ждет, даже если 3D-окно неактивно.
Если вы решили использовать WaitMessage
Вы должны также зацикливаться на PeekMessage
потому что может быть более одного сообщения в очереди и WaitMessage
не возвращается, пока не придет новое сообщение.
Других решений пока нет …