0

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

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

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 func。

在游戏循环中(使用 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 消息都不会出现。

这个问题中,我了解了ChangeWindowMessageFilterEx()但既不 工作ChangeWindowMessageFilterEx(MWND, WM_KEYDOWN,1,NULL);也不ChangeWindowMessageFilterEx(GetConsoleWindow(), WM_KEYDOWN,1,NULL);工作,仍然没有收到消息。如何克服这个麻烦?

4

1 回答 1

0

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

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

于 2019-04-25T13:31:47.903 回答