我正在开发控制台游戏引擎,为此我想制作一些控制界面。
为此,我选择了制作一个隐藏窗口的方法,该窗口读取被按下的键,然后将它们推入队列(我将单独实现这个东西),然后引擎本身只是通过读取队列并执行描述的操作来读取这些键按下每个按钮(控制表)。这就是我的意思:
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);
工作,仍然没有收到消息。如何克服这个麻烦?