如何在控制台应用程序中设置WM_KEYDOWN消息拦截器?

时间:2019-04-25 12:53:49

标签: c winapi console window-messages

我正在开发一个控制台游戏引擎,为此,我想创建一些控制界面。

为此,我选择了一种制作隐藏窗口的方法,该方法读取被按下的键,然后将它们推入队列(我将单独实现的事情),然后引擎本身通过读取队列并执行操作来读取那些键按下的每个按钮(控制表)上所述的内容。这是我的意思:

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)复制),我要求

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消息。

我从this question中学到了ChangeWindowMessageFilterEx(),但都没有 ChangeWindowMessageFilterEx(MWND, WM_KEYDOWN,1,NULL);ChangeWindowMessageFilterEx(GetConsoleWindow(), WM_KEYDOWN,1,NULL);仍在工作,但仍未收到任何消息。如何克服这个麻烦?

1 个答案:

答案 0 :(得分:0)

控制台不是您的窗口,它甚至不在您的进程中。

您可以使用ReadConsoleInput阅读低级别的控制台输入,这对于基于文本的游戏可能就足够了,但是更快的东西可能应该拥有自己的自定义窗口,而不是与控制台API冲突。