如何在Windows-10上的C控制台程序中输入鼠标?

我需要在简单的C控制台程序中与用户的鼠标输入进行交互。 我做了一些研究,并在他们的页面上找到了相关的微软文档 。 首先,我复制了所有的示例代码并将其粘贴到我的编辑器中。 在编译时,它编译得很好,有一个很好的小’.exe’,在运行时,正确地告诉/打印所有’关键事件’和’resize事件’,但没有鼠标事件! 如何在C控制台程序中成功获取鼠标输入? 我的MCVE是Microsoft网站上给出的示例代码 ,因为我逐字使用了该示例代码! 我正在使用Windows 10 Pro(1703),以防万一。


编辑: – 这似乎是一个不是我独有的问题。 另一个StackOverflow用户也在他的Windows-10系统上报告了同样的问题 。 他提供的MCVE也在Windows-7上运行,但不在Windows-10上,就像我在微软网站上引用的MCVE一样,因为示例代码可能适用于较旧的Windows版本,但不适用于Windows-10,其中 “控制台默认值”中似乎启用了 快速编辑模式

花了好几个小时后,我发现了微软官方示例代码中引用的问题失败的罪魁祸首。 罪魁祸首就是控制台本身! 实际上它是‘设置’,‘控制台Windows’的 ‘快速编辑模式

您可以通过以下方式访问它

  1. 打开命令提示符并右键单击其标题栏,然后单击“默认值”
  2. 将出现一个对话框,标题为“控制台Windows属性” 。 在选项选项卡的编辑选项子标题下,您会找到“快速编辑模式”复选框!

我在下面附上了屏幕截图:

右键单击Command-Prompt的标题栏后出现的菜单 控制台Windows属性

问题是由我的Windows 10上默认启用的“快速编辑模式”选项(复选框已选中)引起的。在此启用状态下,此“快速编辑模式”消耗了所有鼠标事件并且没有t调度任何我的’.exe’。

当取消选中(禁用)此“快速编辑模式”选项复选框时,程序在此处的示例代码中按预期/编码运行正常,告知/打印所有鼠标事件。 [P! ]

注意: “控制台属性”中的更改需要重新启动控制台才能生效。


编辑:改进’便携’解决方案!

上面的解决方案不是“便携式的”。 这只适用于本地机器,当然,它也是“手工工作”。 为了使该示例代码工作而不要求用户“手动” 禁用“ 快速编辑模式 ,如上所述,我们可以通过在该示例代码中添加以下代码行来以编程方式禁用“ 快速编辑模式”

/* 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"); 

我在微软关于SetConsoleMode()的文档中发现了’ ENABLE_EXTENDED_FLAGS ‘选项

SetConsoleMode()函数中应用ENABLE_EXTENDED_FLAGS之后,即使用户在“ 控制台默认值 ”选项中启用了“快速编辑模式”选项,我们的程序也会接收/打印所有“鼠标事件”。 在我们的程序完成其工作(在这个超级简单场景中接收鼠标事件)之后,用户的控制台默认值将不受干扰,因为在我们的程序退出之前,它将恢复用户的原始(保存在我们程序的开头) 控制台模式 ,如下所示:

  /* Restore original console mode before exit. */ SetConsoleMode(hStdin, fdwSaveOldMode); 

正如在那里的示例代码中所做的那样,但是如果用户在其控制台中启用了“快速编辑模式”,则无法打印鼠标事件。 因此,为了使该示例代码在用户的控制台默认设置启用了“快速编辑模式”的情况下工作,我们应该在该示例代码中包含/放置代码片段(应用ENABLE_EXTENDED_FLAGS ),如此“编辑”部分所示以上。