You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:52:03