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

时间:2017-10-17 16:37:31

标签: c windows cmd windows-10 windows-console

我需要在简单的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 hereHis provided MCVE也在使用Windows-7,但不是在Windows-10上,就像我在Microsoft网站上引用的MCVE一样,因为示例代码可能适用于较旧的Windows版本,但不适用于windows-10,其中'快速编辑模式' 似乎已在'控制台默认设置' 中启用。

1 个答案:

答案 0 :(得分:2)

花了好几个小时之后,我发现了微软官方sample code here引用的问题失败的罪魁祸首。罪魁祸首就是控制台本身!实际上它是'设置',即'控制台Windows''快速编辑模式'

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

  1. 打开命令提示符并右键单击其标题栏,然后单击“默认值”
  2. 将出现一个对话框,标题为'Console Windows Properties'。在选项标签中,在编辑选项子标题下,您会找到'快速编辑模式'复选框!
  3. 我在下面附上了屏幕截图:

    Appeared Menu after doing Right-Click on Command-Prompt's title bar Console Windows Properties

    问题原因是我的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'部分所示。