花費數小時後,我找到了微軟官方sample code here引用的微軟失敗的罪魁禍首。而罪魁禍首就是控制檯本身!其實這是一個'設置'即'快速編輯模式'爲'控制檯Windows'。
- 打開命令提示符,它的標題欄上單擊鼠標右鍵,然後單擊「默認」
- 一個對話框會出現,標題爲「控制檯窗口屬性:
您可以通過訪問'。有選項選項卡,在編輯選項子標題,你會發現'快速編輯模式'複選框!
我附在下面的屏幕捕獲:
的問題正在由這是默認啓用(複選框被選中)上「快速編輯模式」選項引起我的Windows 10.並處於此啓用狀態,此'快速編輯模式'消耗所有的鼠標事件,並沒有調度任何我的'.exe'。
當這個「快速編輯模式」選項複選框取消選中(禁用),如預期/編碼在sample-code here,告訴/打印所有鼠標事件,則程序運行正常。 [唷! ]
注:在「控制檯屬性」 的變化,需要重新啓動控制檯,才能生效。
編輯:改進'便攜式'的解決方案!
上面的解決方案不是「便攜」。這只是本地機器,當然也是「手動工作」。爲了使該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");
的代碼下面的行
我發現關於「ENABLE_EXTENDED_FLAGS
」選項上Microsoft's docs about SetConsoleMode()
後,我們已申請ENABLE_EXTENDED_FLAGS
在SetConsoleMode()
功能,我們計劃將接收/打印所有的「鼠標事件」,即使用戶在控制檯默認選項中啓用「快速編輯模式」選項。而我們的計劃已經做完了作業(接收這個超級簡單的場景鼠標事件)用戶的控制檯設置後,將不受干擾,因爲之前我們的程序退出,它會恢復用戶的原始(保存在我們的計劃的開始)控制檯模式如下:
/* Restore original console mode before exit. */
SetConsoleMode(hStdin, fdwSaveOldMode);
如該sample-code there,其工作做得好,但無法打印鼠標事件,如果用戶在他的控制檯中啓用「快速編輯模式」。因此,爲了使在場景sample-code工作,其中用戶的控制檯默認具有「快速編輯模式」啓動,我們應該包括/把那個sample-code裏面的代碼片段如本「編輯」部分(適用ENABLE_EXTENDED_FLAGS
的)以上。
你在IDE中運行這個嗎? – stark
我已經使用Windows 7和MSVC 2015編譯並運行了相同的代碼示例,它從控制檯或從GUI文件查看器運行時按預期打印出鼠標事件。我沒有使用IDE。 –
@stark No.我在IDE之外獨立運行編譯的「.exe」。在'atom'中鍵入(粘貼)的代碼。並通過GCC使用命令'gcc inputwin.c -o mouse'編譯源代碼(inputwin.c是文件名,其中我粘貼了該示例,並且該命令生成了'.exe'命名的鼠標)。然後,我從該文件夾所在的Windows資源管理器中運行該mouse.exe。 – FAQi