Окна мультимедиа DirectX не отвечают

Я создаю игру с пользовательским игровым движком, и когда вы выбираете окно, которое оно создает, оно не позволяет вам использовать мультимедийные клавиши, например. изменение громкости или воспроизведение / приостановка музыки или все, что связано с окнами, например получение меню «Пуск» Windows и alt + tab ведут себя странно

Такое ощущение, что мое окно «блокирует» все системные клавиши и команды

Код написан на с ++

Вот код, который я использую для создания окна:

bool FrameWork::CreateDXWnd(int x, int y, int width, int height)
{
HWND hwnd;
WNDCLASSEX wc;

m_hInstance = GetModuleHandle(nullptr);

//setup window class with default setings:
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = m_hInstance;
//wc.hIcon = LoadIcon(nullptr, IDI_WINLOGO);
wc.hIcon = (HICON)LoadImage(m_hInstance, ".\\Assets\\Icons\\NgineIcon512.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
wc.hIconSm = wc.hIcon;
wc.hCursor = LoadCursor(nullptr, IDC_HAND);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = nullptr;
wc.lpszClassName = applicationName.c_str();
wc.cbSize = sizeof(WNDCLASSEX);

if (!RegisterClassEx(&wc))
{
Error(1);
return false;
}

//Style of window
//int nStyle = WS_OVERLAPPED | WS_SYSMENU | WS_VISIBLE | WS_CAPTION | WS_MINIMIZEBOX;
int nStyle = WS_OVERLAPPED | WS_SYSMENU | WS_VISIBLE | WS_CAPTION | WS_MINIMIZEBOX;

SettingsManager::GetInstance()->SetNativeResolution(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));

if (SettingsManager::GetInstance()->GetDisplayMode() == FULLSCREEN)
{
DEVMODE dmScreenSettings;
memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
dmScreenSettings.dmSize = sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = (unsigned long)SettingsManager::GetInstance()->GetScreenWidth();
dmScreenSettings.dmPelsHeight = (unsigned long)SettingsManager::GetInstance()->GetScreenHeight();
dmScreenSettings.dmBitsPerPel = 32;
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
}
else
{

}
if ((SettingsManager::GetInstance()->GetDisplayMode() == BORDERLESS))
{
hwnd = CreateWindowEx(WS_EX_APPWINDOW, applicationName.c_str(), applicationName.c_str(), WS_POPUP, x, y, SettingsManager::GetInstance()->GetScreenWidth(), SettingsManager::GetInstance()->GetScreenHeight(), nullptr, nullptr, m_hInstance, nullptr);
}
else
{
hwnd = CreateWindowEx(WS_EX_APPWINDOW, applicationName.c_str(), applicationName.c_str(), nStyle, x, y, SettingsManager::GetInstance()->GetScreenWidth(), SettingsManager::GetInstance()->GetScreenHeight(), nullptr, nullptr, m_hInstance, nullptr);

}if (hwnd == nullptr)
{
Error(2);
Ngine::GetInstance()->Release();
PostQuitMessage(0);
return false;
}

if (!Ngine::GetInstance()->InitGraphics(hwnd))
{
Error(hwnd, 30);
Ngine::GetInstance()->Release();
PostQuitMessage(0);
UnregisterClass(applicationName.c_str(), m_hInstance);
m_hInstance = nullptr;
DestroyWindow(hwnd);

return false;
}

Ngine::GetInstance()->GetGraphics()->SetHwnd(hwnd);

ShowWindow(hwnd, SW_SHOW);
SetForegroundWindow(hwnd);
SetFocus(hwnd);

return true;
}

1

Решение

Тим. Код, с которым вы показываете сделки создание окно, а не с тем, как обращаться с вход к окну. Для обработки ввода вам необходимо настроить цикл обработки сообщений в вашем коде.

Как правило, в игровом движке у вас будет основной цикл или «цикл игры», при котором каждый проход цикла обычно приводит к выводу одного кадра. Первое, что делает Game Loop, это обрабатывает оконные сообщения. Это позволяет вам обрабатывать типичные функции Windows. Затем, когда у вас больше не будет сообщений для обработки, вы перейдете к обработке логики и рендеринга вашей игры.

Я рекомендую вам взглянуть на Учебники Брайнзарсофт. Учебник, который я связал, посвящен настройке вашего окна и созданию простой системы сообщений Windows.

Как только вы поймете основы этого, вы можете уточнить свой пост, если это необходимо, чтобы получить больше информации.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]