Я работаю над консольным игровым движком, и для него я хотел бы создать некоторый интерфейс управления.
Для этого я выбрал подход к созданию скрытого окна, в котором читаются нажатия клавиш, затемпомещает их в очередь (эту вещь я реализую отдельно), а затем сам движок просто читает эти клавиши, читая очередь и выполняя действия, описанные для каждой нажатой кнопки (таблица управления).Вот что я имею в виду:
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);
не работает, но сообщения до сих пор не получены.Как преодолеть эту неприятность?