2017-10-17 69 views
-1

我需要在簡單的C控制檯程序中與用戶的鼠標輸入交互。我做了一些研究,發現a related Microsoft's docs on their page here。首先,我複製了所有的示例代碼並將其粘貼到我的編輯器中。編譯後,編譯得很好,有一個很好的'.exe',它在運行時告訴/正確地打印所有的'Key events'和'resize events',但沒有Mouse事件!如何在C控制檯程序中成功獲取鼠標輸入?我的MCVE是Microsoft網站上給出的sample-code here,因爲我使用的是逐字的示例代碼!我正在使用Windows 10 Pro(1703),以防萬一。如何在Windows-10的C控制檯程序中獲取鼠標輸入?


編輯: - 這似乎是這不是唯一對我的問題。他的Windows-10系統上的另一個StackOverflow用戶also reported the same problem hereHis provided MCVE也在Windows-7上工作,但不是在Windows-10上,就像我在微軟網站上引用的MCVE一樣,因爲示例代碼可能適用於較舊的Windows版本,但不適用於Windows-10,其中'Quick編輯模式'貌似在'控制檯默認值'中啓用。

+0

你在IDE中運行這個嗎? – stark

+1

我已經使用Windows 7和MSVC 2015編譯並運行了相同的代碼示例,它從控制檯或從GUI文件查看器運行時按預期打印出鼠標事件。我沒有使用IDE。 –

+0

@stark No.我在IDE之外獨立運行編譯的「.exe」。在'atom'中鍵入(粘貼)的代碼。並通過GCC使用命令'gcc inputwin.c -o mouse'編譯源代碼(inputwin.c是文件名,其中我粘貼了該示例,並且該命令生成了'.exe'命名的鼠標)。然後,我從該文件夾所在的Windows資源管理器中運行該mouse.exe。 – FAQi

回答

2

花費數小時後,我找到了微軟官方sample code here引用的微軟失敗的罪魁禍首。而罪魁禍首就是控制檯本身!其實這是一個'設置''快速編輯模式''控制檯Windows'

  1. 打開命令提示符,它的標題欄上單擊鼠標右鍵,然後單擊「默認」
  2. 一個對話框會出現,標題爲「控制檯窗口屬性:

    您可以通過訪問'。有選項選項卡,在編輯選項子標題,你會發現'快速編輯模式'複選框!

我附在下面的屏幕捕獲:

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

的問題正在由這是默認啓用(複選框被選中)上「快速編輯模式」選項引起我的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_FLAGSSetConsoleMode()功能,我們計劃將接收/打印所有的「鼠標事件」,即使用戶在控制檯默認選項中啓用「快速編輯模式」選項。而我們的計劃已經做完了作業(接收這個超級簡單的場景鼠標事件)用戶的控制檯設置後,將不受干擾,因爲之前我們的程序退出,它會恢復用戶的原始(保存在我們的計劃的開始)控制檯模式如下:

  /* Restore original console mode before exit. */ 
     SetConsoleMode(hStdin, fdwSaveOldMode); 

如該sample-code there,其工作做得好,但無法打印鼠標事件,如果用戶在他的控制檯中啓用「快速編輯模式」。因此,爲了使在場景sample-code工作,其中用戶的控制檯默認具有「快速編輯模式」啓動,我們應該包括/把那個sample-code裏面的代碼片段如本「編輯」部分(適用ENABLE_EXTENDED_FLAGS的)以上。

相關問題