Окна мультимедиа DirectX не отвечают - PullRequest
0 голосов
/ 12 ноября 2018

Я создаю игру с пользовательским игровым движком, и когда вы выбрали окно, которое оно создает, оно не позволяет вам использовать мультимедийные клавиши, например. изменение громкости или воспроизведение / приостановка музыки или все, что связано с окнами, например получение меню «Пуск» 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 Ответ

0 голосов
/ 13 ноября 2018

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

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

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

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

...