我需要在我的简单C控制台程序中与用户的鼠标输入交互。我做了一些研究,发现了这里有与微软相关的文档。首先,我复制了他们所有的示例代码,并将其粘贴到我的编辑器中。编译后,它得到了很好的编译,它有一个很好的小“.exe”,在运行时可以正确地告诉/打印所有的“关键事件”和“调整大小的事件”,但是没有鼠标事件!如何在C控制台程序中成功地获取鼠标输入?我的MCVE是微软网站上给定的这里的样本代码,因为我逐字使用了示例代码!我正在使用Windows 10 Pro (1703),以防万一。
编辑:--这似乎不是我独有的问题。另一个StackOverflow用户这里也报告了同样的问题在他的Windows-10系统上。他提供的MCVE也在Windows7上工作,但没有在Windows-10上工作,就像我引用的微软网站上的MCVE示例一样--代码可能在较旧的windows版本上工作,但在windows-10上不起作用,因为'Quick模式‘似乎是在’控制台-默认值‘中启用的。
发布于 2017-10-18 04:17:11
在花了几个小时之后,我发现了微软官方这里的示例代码失败的罪魁祸首。罪魁祸首就是安慰本身!实际上,这是一个“设置”,即“”、“快速编辑模式”(Quick)、“控制台Windows”的。
您可以通过以下方式访问它:
我附上了下面的屏幕截图:
这个问题是由默认情况下在我的Windows 10上启用的‘快速编辑模式’选项引起的(复选框被选中)。在此启用状态下,该‘快速编辑模式’正在消耗所有的鼠标事件,并且没有向我的'.exe‘发送任何东西。
当此‘快速编辑模式’选项‘复选框未选中(禁用)时,程序将按照该这里的样本代码中的预期/编码良好运行,通知/打印所有鼠标事件。呼!
注意: 'Console Properties‘中的更改需要重新启动控制台才能生效。
编辑:改进的“可移植”解决方案!
上面的解决方案不是“便携式”的。这只是为本地机器,当然,这也是‘人工工作’。要使该样本码工作,而不需要用户“手动”禁用快速编辑模式,我们可以通过在该样本码中添加以下代码行,以编程方式禁用快速编辑模式
/*
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()
上找到了‘SetConsoleMode()
’选项
在我们将ENABLE_EXTENDED_FLAGS
应用于SetConsoleMode()
函数之后,即使用户在控制台默认选项中启用了“快速编辑模式”选项,我们的程序也会接收/打印所有“鼠标事件”。在我们的程序完成了它的工作(在这个超级简单的场景中接收鼠标事件)之后,用户的控制台默认设置将不受干扰,因为在我们的程序退出之前,它将恢复用户的原始控制台模式(保存在程序开始时),如下所示:
/* Restore original console mode before exit. */
SetConsoleMode(hStdin, fdwSaveOldMode);
正如在该那里的样本代码中所做的那样,它工作得很好,但是如果用户在控制台中启用了“快速编辑模式”,则无法打印鼠标事件。因此,要使样本码在用户控制台默认启用“快速编辑模式”的情况下工作,我们应该在样本码中包含/放入代码片段(应用ENABLE_EXTENDED_FLAGS
),如上面的‘编辑’部分所示。
https://stackoverflow.com/questions/46795072
复制相似问题