我正在开发一个主机游戏引擎,为此我想制作一些控制界面。
为此,我选择了制作一个隐藏窗口的方法,该窗口读取正在按下的键,然后将它们推送到队列中(我将单独实现),然后引擎本身只是通过读取队列并执行每个按钮上描述的操作来读取这些键按下(控制表)。我的意思是:
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! %un", uMsg);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
但是它收到的所有消息都是36,129,131,1,这是窗口本身的创建消息,但是不存在来自控制台的消息,我按下任何键,WM_KEYDOWN消息都没有出现。
从这个问题中,我了解了ChangeWindowMessageFilterEx(),但两者都没有。ChangeWindowMessageFilterEx(MWND, WM_KEYDOWN,1,NULL);
NORChangeWindowMessageFilterEx(GetConsoleWindow(), WM_KEYDOWN,1,NULL);
正常工作,仍然没有收到任何消息。如何克服这个麻烦?
控制台不是您的窗口,它甚至不存在于您的进程中。
您可以使用ReadConsoleInput
读取低级控制台输入,这对于基于文本的游戏来说可能已经足够了,但更快的东西可能应该有自己的自定义窗口,而不是对抗控制台 API。