我需要在简单的C控制台程序中与用户的鼠标输入进行交互。我做了一些研究,发现a related Microsoft's docs on their page here。首先,我复制了所有的示例代码并将其粘贴到我的编辑器中。在编译时,它编译得很好,有一个很好的小.exe。#39;在运行时,正确地告诉/打印所有关键事件'和'调整事件大小,但没有鼠标事件!如何在C控制台程序中成功获取鼠标输入?我的MCVE是Microsoft网站上给定的sample-code here,因为我逐字使用了该示例代码!我使用的是Windows 10 Pro(1703),以防万一。
编辑: - 这似乎是一个不是我独有的问题。他的Windows-10系统上的另一个StackOverflow用户also reported the same problem here。 His provided MCVE也在使用Windows-7,但不是在Windows-10上,就像我在Microsoft网站上引用的MCVE一样,因为示例代码可能适用于较旧的Windows版本,但不适用于windows-10,其中'快速编辑模式' 似乎已在'控制台默认设置' 中启用。
答案 0 :(得分:2)
花了好几个小时之后,我发现了微软官方sample code here引用的问题失败的罪魁祸首。罪魁祸首就是控制台本身!实际上它是'设置',即'控制台Windows'的'快速编辑模式'。
您可以通过以下方式访问它:
我在下面附上了屏幕截图:
问题原因是我的Windows 10默认启用了'快速编辑模式'选项(复选框已选中)。在此启用状态下,此'快速编辑模式'正在使用所有鼠标事件,并且没有将任何内容发送到我的'.exe'。
如果未选中(禁用)此'快速编辑模式'选项'复选框,则程序在sample-code here中按预期/编码正常运行,告知/打印所有鼠标事件。 [P! ]
注意:“控制台属性”中的更改需要重新启动控制台才能生效。
编辑:改进'便携式'解决方案!
上述解决方案不是“便携式”。这只适用于本地机器,当然,它也是“手工工作”。要使sample-code工作而不要求用户禁用 快速编辑模式 '手动',如上所述,我们可以通过在sample-code
中添加以下代码行,以编程方式禁用 快速编辑模式 /*
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");
我在Microsoft's docs about SetConsoleMode()
ENABLE_EXTENDED_FLAGS
”选项
我们在ENABLE_EXTENDED_FLAGS
函数中应用SetConsoleMode()
之后,即使用户在控制台默认值<启用了“快速编辑模式”选项,我们的程序也会接收/打印所有“鼠标事件” / em>选项。在我们的程序完成其工作(在这个超级简单场景中接收鼠标事件)之后,用户的控制台默认值将不受干扰,因为在我们的程序退出之前,它将恢复用户的原始文件(保存在我们的开头)程序)控制台模式如下:
/* Restore original console mode before exit. */
SetConsoleMode(hStdin, fdwSaveOldMode);
正如在sample-code there中所做的那样,如果用户在其控制台中启用了“快速编辑模式”,那么会失败来打印鼠标事件。因此,为了使sample-code在用户的控制台默认值启用了“快速编辑模式”的情况下工作,我们应该在sample-code内部包含/放入代码片段(的应用ENABLE_EXTENDED_FLAGS
),如上面的'EDIT'部分所示。