如何在 Windows-10 上的 C 控制台程序中获取鼠标输入?
How to get Mouse input inside a C console program on Windows-10?
我需要在我的简单 C 控制台程序中与用户的鼠标输入进行交互。我做了一些研究并在 Microsoft 站点上找到了 a related Microsoft's docs on their page here. For a start, I copied all of their sample-code and pasted that into my editor. Upon compilation, it gets compiled well, with a nice little '.exe' which when run, tells/prints correctly all 'Key events' and 'resize events', But No Mouse event! How to successfully get mouse input inside C console program? My MCVE is the given sample-code here,因为我逐字使用了该示例代码!我正在使用 Windows 10 Pro (1703),以防万一。
编辑: - 这似乎不是我独有的问题。另一个 Whosebug 用户 also reported the same problem here on his Windows-10 system. His provided MCVE 也在 Windows-7 上工作,但不在 Windows-10 上工作,就像我在 Microsoft 网站上作为示例代码引用的 MCVE 可能在旧版本上工作一样Windows-版本,但不在 windows-10 上,其中 'Quick Edit Mode' 似乎在 'Console-Defaults'[ 中启用=22=].
花了几个小时后,我找到了 quoted-in-my-question 微软官方 sample code here 失败的罪魁祸首。而罪魁祸首就是控制台本身!实际上它是一个 'setting' 即 'Quick Edit Mode' 对于 'Console Windows'.
您可以通过以下方式访问它:
- 在其 title-bar 上打开 command-prompt 和 right-clicking,然后单击 'Defaults'
- 将出现一个对话框,标题为 'Console Windows Properties'。在 选项 选项卡中,在 编辑选项 sub-heading 下,您会找到 'Quick Edit Mode' 复选框!
我已在下方附上 screen-captures:
问题是由 'Quick Edit Mode' 选项引起的,该选项在我的 Windows 10 上默认启用(选中复选框)。在这个启用状态,此 'Quick Edit Mode' 正在消耗所有 Mouse-Events 并且没有向我的“.exe”发送任何内容。
当此 'Quick Edit Mode' 选项的复选框未选中(禁用)时,程序运行正常 intended/coded sample-code here,telling/printing 所有鼠标事件。 【呸! ]
注意:'Console Properties'中的更改需要重新启动控制台才能生效。
编辑:改进 'PORTABLE' 解决方案!
上面的解决方案不是'portable'。那只是 local-machine,当然,它也是 'manual work'。使 sample-code work without requiring user to disable Quick Edit Mode 'manually' as explained above, we can disable Quick Edit Mode programmatically by adding following lines of code inside that 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
”选项
在我们在 SetConsoleMode()
函数中应用 ENABLE_EXTENDED_FLAGS
之后,我们的程序将 receive/print 所有 'Mouse Events' 即使用户在 控制台默认值 选项。在我们的程序完成其工作(在这个超级简单的场景中接收鼠标事件)后,用户的 Console Defaults 将不受干扰,因为在我们的程序退出之前,它将恢复用户的原始(保存在我们程序的开始)控制台模式如下:
/* Restore original console mode before exit. */
SetConsoleMode(hStdin, fdwSaveOldMode);
如上面 'EDIT' 部分所示 sample-code there, which works well, but fails to print Mouse events if user has 'Quick Edit Mode' enabled in his console. Therefore, to make that sample-code work in scenarios where user's Console Defaults has 'Quick Edit Mode' enabled, we should include/put inside that sample-code code-snippet(应用 ENABLE_EXTENDED_FLAGS
) .
我需要在我的简单 C 控制台程序中与用户的鼠标输入进行交互。我做了一些研究并在 Microsoft 站点上找到了 a related Microsoft's docs on their page here. For a start, I copied all of their sample-code and pasted that into my editor. Upon compilation, it gets compiled well, with a nice little '.exe' which when run, tells/prints correctly all 'Key events' and 'resize events', But No Mouse event! How to successfully get mouse input inside C console program? My MCVE is the given sample-code here,因为我逐字使用了该示例代码!我正在使用 Windows 10 Pro (1703),以防万一。
编辑: - 这似乎不是我独有的问题。另一个 Whosebug 用户 also reported the same problem here on his Windows-10 system. His provided MCVE 也在 Windows-7 上工作,但不在 Windows-10 上工作,就像我在 Microsoft 网站上作为示例代码引用的 MCVE 可能在旧版本上工作一样Windows-版本,但不在 windows-10 上,其中 'Quick Edit Mode' 似乎在 'Console-Defaults'[ 中启用=22=].
花了几个小时后,我找到了 quoted-in-my-question 微软官方 sample code here 失败的罪魁祸首。而罪魁祸首就是控制台本身!实际上它是一个 'setting' 即 'Quick Edit Mode' 对于 'Console Windows'.
您可以通过以下方式访问它:
- 在其 title-bar 上打开 command-prompt 和 right-clicking,然后单击 'Defaults'
- 将出现一个对话框,标题为 'Console Windows Properties'。在 选项 选项卡中,在 编辑选项 sub-heading 下,您会找到 'Quick Edit Mode' 复选框!
我已在下方附上 screen-captures:
问题是由 'Quick Edit Mode' 选项引起的,该选项在我的 Windows 10 上默认启用(选中复选框)。在这个启用状态,此 'Quick Edit Mode' 正在消耗所有 Mouse-Events 并且没有向我的“.exe”发送任何内容。
当此 'Quick Edit Mode' 选项的复选框未选中(禁用)时,程序运行正常 intended/coded sample-code here,telling/printing 所有鼠标事件。 【呸! ]
注意:'Console Properties'中的更改需要重新启动控制台才能生效。
编辑:改进 'PORTABLE' 解决方案!
上面的解决方案不是'portable'。那只是 local-machine,当然,它也是 'manual work'。使 sample-code work without requiring user to disable Quick Edit Mode 'manually' as explained above, we can disable Quick Edit Mode programmatically by adding following lines of code inside that 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
”选项
在我们在 SetConsoleMode()
函数中应用 ENABLE_EXTENDED_FLAGS
之后,我们的程序将 receive/print 所有 'Mouse Events' 即使用户在 控制台默认值 选项。在我们的程序完成其工作(在这个超级简单的场景中接收鼠标事件)后,用户的 Console Defaults 将不受干扰,因为在我们的程序退出之前,它将恢复用户的原始(保存在我们程序的开始)控制台模式如下:
/* Restore original console mode before exit. */
SetConsoleMode(hStdin, fdwSaveOldMode);
如上面 'EDIT' 部分所示 sample-code there, which works well, but fails to print Mouse events if user has 'Quick Edit Mode' enabled in his console. Therefore, to make that sample-code work in scenarios where user's Console Defaults has 'Quick Edit Mode' enabled, we should include/put inside that sample-code code-snippet(应用 ENABLE_EXTENDED_FLAGS
) .