如何在ImGui窗口打开时禁用键盘与鼠标输入?
问题
我正在使用ImGui v1.84,希望在ImGui窗口打开时禁用所有键盘和鼠标输入。我是ImGui新手,当前使用Kiero Hook Dx11。我修改了WndProc函数来处理输入事件,但不确定是否正确,相关代码如下:
LRESULT __stdcall WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_KEYDOWN && wParam == VK_INSERT) { showImGuiWindow = !showImGuiWindow; ImGui::GetIO().MouseDrawCursor = showImGuiWindow; // To Toggle Mouse Cursor return true; } if (showImGuiWindow) { if (ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam)) return true; // Block all keyboard and mouse input events when ImGui window is open? if (uMsg == WM_KEYDOWN || uMsg == WM_KEYUP || uMsg == WM_CHAR || uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONUP || uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP || uMsg == WM_MOUSEWHEEL || uMsg == WM_MOUSEHWHEEL) { return true; } } return CallWindowProc(oWndProc, hWnd, uMsg, wParam, lParam); }
解决方案
你的思路方向正确,但现有代码存在两处不足:
- 硬编码消息列表易遗漏:比如
WM_SYSKEYDOWN、WM_SYSKEYUP这类系统按键消息未被拦截,Alt等按键仍会传递给原程序。 - 代码冗余:逐个列举消息不够简洁,可通过Windows消息范围宏简化判断。
修改后的代码
LRESULT __stdcall WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // 切换ImGui窗口显示状态 if (uMsg == WM_KEYDOWN && wParam == VK_INSERT) { showImGuiWindow = !showImGuiWindow; ImGui::GetIO().MouseDrawCursor = showImGuiWindow; return true; } if (showImGuiWindow) { // 优先让ImGui处理自身交互消息 ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam); // 判断是否为键盘/鼠标消息,是则拦截不传递给原程序 bool isKeyboardMsg = (uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST) || uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP || uMsg == WM_SYSCHAR; bool isMouseMsg = (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST); if (isKeyboardMsg || isMouseMsg) { return true; } } // 非ImGui窗口状态或非输入消息,传递给原窗口过程 return CallWindowProc(oWndProc, hWnd, uMsg, wParam, lParam); }
关键说明
- 优先处理ImGui消息:先调用
ImGui_ImplWin32_WndProcHandler,确保ImGui自身的交互(拖动窗口、输入文本等)正常工作。 - 范围式判断输入消息:用
WM_KEYFIRST/WM_KEYLAST覆盖普通键盘消息,补充系统按键消息;用WM_MOUSEFIRST/WM_MOUSELAST覆盖所有鼠标相关消息(移动、按键、滚轮),避免遗漏。 - 拦截输入消息:只要是键盘或鼠标消息,处理后直接返回
true,不传递给原程序,实现“禁用所有键盘鼠标输入到原程序”的需求。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

