Я создаю игру с пользовательским игровым движком, и когда вы выбрали окно, которое он создает, оно не позволяет вам использовать мультимедийные ключи, например. изменение громкости или воспроизведение / приостановка музыки или все, что связано с окнами, например, открытие меню запуска Windows и вкладки alt +, ведет себя странно
Такое ощущение, что мое окно «блокирует» все системные клавиши и команды.
Код написан на C++
Вот код, который я использую для создания окна:
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;
}
Какую часть кода вы предлагаете плохой публикации, я не думаю, что это не проблема с обработкой ввода, поскольку я не использую кнопки мультимедиа в игре. Может быть, мне нужно каким-то образом пересылать их в систему?
Вам, вероятно, следует изучить части этого «пользовательского игрового движка» и выяснить, как он обрабатывает ввод.
ALT + TAB может вести себя странно, потому что вы используете устаревшую функцию (ChangeDisplaySettings) для реализации полноэкранного режима. Вы должны использовать DXGI, использовать «поддельный полноэкранный режим» или, еще лучше, просто «развернутое окно без полей». См. Directx-vs-шаблоны для некоторых простых окон Win32 DirectX / циклов сообщений.





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