首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Windows-10上的C控制台程序中获取鼠标输入?

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

Stack Overflow用户
提问于 2017-10-17 16:37:30
回答 1查看 3K关注 0票数 1

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

编辑:--这似乎不是我独有的问题。另一个StackOverflow用户这里也报告了同样的问题在他的Windows-10系统上。他提供的MCVE也在Windows7上工作,但没有在Windows-10上工作,就像我引用的微软网站上的MCVE示例一样--代码可能在较旧的windows版本上工作,但在windows-10上不起作用,因为'Quick模式‘似乎是在’控制台-默认值‘中启用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-18 04:17:11

在花了几个小时之后,我发现了微软官方这里的示例代码失败的罪魁祸首。罪魁祸首就是安慰本身!实际上,这是一个“设置”,即“”、“快速编辑模式”(Quick)、“控制台Windows”的

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

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

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

这个问题是由默认情况下在我的Windows 10上启用的‘快速编辑模式’选项引起的(复选框被选中)。在此启用状态下,该‘快速编辑模式’正在消耗所有的鼠标事件,并且没有向我的'.exe‘发送任何东西。

当此‘快速编辑模式’选项‘复选框未选中(禁用)时,程序将按照该这里的样本代码中的预期/编码良好运行,通知/打印所有鼠标事件。呼!

注意: 'Console Properties‘中的更改需要重新启动控制台才能生效。

编辑:改进的“可移植”解决方案!

上面的解决方案不是“便携式”的。这只是为本地机器,当然,这也是‘人工工作’。要使该样本码工作,而不需要用户“手动”禁用快速编辑模式,我们可以通过在该样本码中添加以下代码行,以编程方式禁用快速编辑模式

代码语言:javascript
运行
复制
        /* 
           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()函数之后,即使用户在控制台默认选项中启用了“快速编辑模式”选项,我们的程序也会接收/打印所有“鼠标事件”。在我们的程序完成了它的工作(在这个超级简单的场景中接收鼠标事件)之后,用户的控制台默认设置将不受干扰,因为在我们的程序退出之前,它将恢复用户的原始控制台模式(保存在程序开始时),如下所示:

代码语言:javascript
运行
复制
         /* Restore original console mode before exit. */
         SetConsoleMode(hStdin, fdwSaveOldMode);

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46795072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档