Как настроить перехватчик сообщений WM_KEYDOWN в консольном приложении? - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю над консольным игровым движком, и для него я хотел бы создать некоторый интерфейс управления.

Для этого я выбрал подход к созданию скрытого окна, в котором читаются нажатия клавиш, затемпомещает их в очередь (эту вещь я реализую отдельно), а затем сам движок просто читает эти клавиши, читая очередь и выполняя действия, описанные для каждой нажатой кнопки (таблица управления).Вот что я имею в виду:

bool _CreateMessageWnd(HWND* MWND)
{
    WNDCLASSEX wx = {0};
    wx.cbSize = sizeof(WNDCLASSEX);
    wx.lpfnWndProc = HandleMessageSetup;        // function which will handle messages
    wx.hInstance = GetModuleHandle(NULL);
    wx.lpszClassName = L"Dummy";
    if (RegisterClassEx(&wx)) {
        *MWND = CreateWindowExW(0, L"Dummy", L"dummy_name", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, GetModuleHandle(NULL), NULL);
        return true;
    }
    return false;
}

Эта функция создает окно сообщения и устанавливает HandleMessageSetup() в качестве функции proc.

В цикле игры (повторяется с while (1)) Iвызов для

void _DispMessage()
{
    MSG msg;
    if(GetMessageW(&msg, 0, 0, 0) > 0) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

и процедура перехвата сообщения выглядит следующим образом:

LRESULT CALLBACK HandleMessageSetup(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        printf("Got a message! %u\n", uMsg);
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

но все сообщения, которые она получает, это 36, 129, 131, 1, которые являются сообщениями создания окнасам, но никаких сообщений от консоли нет, ни одна клавиша, которую я нажимаю, WM_KEYDOWN сообщение не появляется.

из этот вопрос Я узнал о ChangeWindowMessageFilterEx () , но ниChangeWindowMessageFilterEx(MWND, WM_KEYDOWN,1,NULL); ни ChangeWindowMessageFilterEx(GetConsoleWindow(), WM_KEYDOWN,1,NULL); не работает, но сообщения до сих пор не получены.Как преодолеть эту неприятность?

1 Ответ

0 голосов
/ 25 апреля 2019

Консоль не ваше окно, она даже не живет в вашем процессе.

Вы можете прочитать низкоуровневый ввод с консоли с помощью ReadConsoleInput, и этого может быть достаточно для текстовой игры, но что-то более быстрое, вероятно, должно иметь свое собственное окно вместо борьбы с консолью.API.

...