FAQ*_*AQi 1 c windows cmd windows-console windows-10
我需要在我的简单 C 控制台程序中与用户的鼠标输入进行交互。我做了一些研究,并在他们的页面上找到了相关的微软文档。首先,我复制了他们所有的示例代码并将其粘贴到我的编辑器中。编译后,它编译得很好,有一个漂亮的小“.exe”,运行时,正确地告诉/打印所有“按键事件”和“调整大小事件”,但没有鼠标事件!如何在C控制台程序中成功获取鼠标输入?我的MCVE是 Microsoft 网站上给定的示例代码,因为我逐字使用了该示例代码!我正在使用 Windows 10 Pro (1703),以防万一。
编辑: -这似乎不是我独有的问题。另一位 StackOverflow 用户也在他的 Windows-10 系统上报告了同样的问题。他提供的 MCVE也适用于 Windows-7,但不适用于 Windows-10,就像我在 Microsoft 网站上引用的 MCVE 作为示例代码一样,可能适用于较旧的 Windows 版本,但不适用于 Windows-10,其中'似乎在“控制台默认值”中启用了“快速编辑模式”。
花了几个小时后,我找到了我的问题中引用的微软官方示例代码失败的罪魁祸首。罪魁祸首就是控制台本身!实际上,它是“控制台窗口”的“设置”,即“快速编辑模式”。
您可以通过以下方式访问它:
我在下面附上了屏幕截图:
该问题是由我的 Windows 10 上默认启用的“快速编辑模式”选项引起的(选中复选框)。在启用状态下,此“快速编辑模式”消耗了所有鼠标事件,并且没有“ t 将任何内容分派到我的 '.exe' 。
当此“快速编辑模式”选项'复选框未选中(禁用)时,程序将按照此处示例代码中的预期/编码正常运行,告诉/打印所有鼠标事件。【唷!]
注意: “控制台属性”中的更改需要重新启动控制台才能生效。
编辑:改进的“便携式”解决方案!
上面的解决方案不是“便携式”的。这仅适用于本地机器,当然,这也是“手动工作”。为了使该示例代码工作而不需要用户“手动”禁用 快速编辑模式 (如上所述),我们可以通过在该示例代码中添加以下代码行以编程方式禁用快速编辑模式
/*
Step-1:
Disable 'Quick Edit Mode' option programmatically
*/
fdwMode = ENABLE_EXTENDED_FLAGS;
if (! SetConsoleMode(hStdin, fdwMode) )
ErrorExit("SetConsoleMode");
/*
Step-2:
Enable the window and mouse input events,
after you have already applied that 'ENABLE_EXTENDED_FLAGS'
to disable 'Quick Edit Mode'
*/
fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
if (! SetConsoleMode(hStdin, fdwMode) )
ErrorExit("SetConsoleMode");
Run Code Online (Sandbox Code Playgroud)
我ENABLE_EXTENDED_FLAGS在微软的文档中找到了关于“ ”的选项SetConsoleMode()
在我们应用功能后ENABLE_EXTENDED_FLAGS,SetConsoleMode()即使用户在控制台默认选项中启用了“快速编辑模式”选项,我们的程序也会接收/打印所有“鼠标事件”。在我们的程序完成其工作(在这个超级简单的场景中接收鼠标事件)之后,用户的控制台默认值将不会受到干扰,因为在我们的程序退出之前,它将恢复用户的原始(保存在程序开始时)控制台模式,如下所示:
/* Restore original console mode before exit. */
SetConsoleMode(hStdin, fdwSaveOldMode);
Run Code Online (Sandbox Code Playgroud)
正如该示例代码中所做的那样,它运行良好,但如果用户在控制台中启用了“快速编辑模式”,则无法打印鼠标事件。因此,为了使该示例代码在用户的控制台默认设置启用了“快速编辑模式”的情况下工作,我们应该在该示例代码中包含/放入(应用的)代码片段ENABLE_EXTENDED_FLAGS,如上面的“编辑”部分所示。