gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:18:38 25 4
gpt4 key购买 nike

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

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

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()设置为过程函数。

在游戏循环中(使用 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); 正在工作,但仍然没有收到消息。如何克服这个麻烦?

最佳答案

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

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

关于c - 如何在控制台应用程序中设置WM_KEYDOWN消息拦截器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com