给控制台输入模式加上 ENABLE_MOUSE_INPUT,只表示鼠标事件可以被放进控制台输入缓冲区,并不表示任何读取方式都能拿到点击。程序如果仍用 ReadFile 或 ReadConsole 去读,鼠标事件会被丢弃,表现出来就是“明明开了鼠标输入,却读不到点击”。这既不能说明键鼠硬件损坏,也不能直接判定设置没有生效。适用前提是 Windows 桌面控制台程序,且操作对象是该程序真正的控制台输入缓冲区句柄。

从官方 GetConsoleMode 的说明看,ENABLE_MOUSE_INPUT 的作用范围就是把鼠标事件放入控制台输入缓冲区,而这类事件会被 ReadFile 或 ReadConsole 丢弃,即使已开启该模式,这两种读取方式也不会返回鼠标事件。要真正取到点击,应改用 ReadConsoleInput,按记录类型读取 MOUSE_EVENT 记录。也就是说,模式位、消费 API、句柄三者要对得上,缺一项都会出现“已开启但读不到”的现象。
可核查的顺序建议如下。第一,确认句柄是不是输入缓冲区句柄:控制台程序的输入句柄与输出句柄是两回事,拿输出句柄去查输入模式没有意义。第二,确认没有把输入模式标志与输出模式标志混用,两套 flag 语义不同,混在一起核对会得出错误结论。第三,确认 GetConsoleMode 调用本身成功,且句柄具备 GENERIC_READ 权限;调用失败时读到的模式值不可用。第四,确认消费端 API 与事件类型匹配,用 ReadConsoleInput 读 MOUSE_EVENT,而不是继续用面向字符流的读取函数。
排查的风险主要在“动手改”上。不建议直接修改客户现场的控制台模式做试验,也不要用关闭窗口的方式结束进程,那会丢掉尚未取走的输出;不能仅凭这项API现象安装鼠标驱动或断定硬件正常。核查应保持只读,范围限定在当前程序路径及其控制台句柄、模式与读取调用上。
按结果分支处理:如果句柄来源或打开权限不对、GetConsoleMode 调用失败,先修正句柄与权限;如果模式位正确但读取仍走 ReadFile 或 ReadConsole,问题在消费 API,应改为 ReadConsoleInput 并按 MOUSE_EVENT 解析;如果模式位本身没有置上,再回到设置环节单独确认。边界要说清:以上只适用于 Windows 桌面控制台程序,不扩展到浏览器页面或所有终端,浏览器里的点击不经过控制台输入缓冲区,套用这套结论会误判。
下一步观察还须核控制台窗口是否拥有键盘焦点、鼠标指针是否位于窗口边界内;这是官方对鼠标事件进入输入缓冲区列出的条件,不能只检查一个模式位。以上过程只核已有代码和记录,不在客户程序中改模式试错。
海港区台式电脑用户可拨400-877-9605,先整理输入句柄来源、模式查询结果、窗口焦点和消费API。电脑快修网提供信息展示与第三方维修对接,具体地址、电脑侧检查是否支持及安排需当次核实,启用范围不代表即时履约。