2016-06-21 53 views
0

我似乎無法找到如何通過WinAPI在我的控制檯應用程序中選擇文本。差不多就是可以用鼠標來完成,如果有人右鍵單擊控制檯窗口,選擇「標記」:如何以編程方式在控制檯應用程序中選擇文本?

enter image description here

,然後拖動鼠標在控制檯窗口:

enter image description here

我可以用WinAPI做這個嗎?

+0

這裏是如何:http://stackoverflow.com/questions/2210245/can-i-get-copy-paste-functionality-from-ac-sharp-console-window – 2016-06-21 19:26:52

+1

@Nope,問題是要做到這一點編程。 – chris

+0

['ReadConsoleOutput'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684965(v = vs.85).aspx)看起來應該如此。 – chris

回答

3

有沒有API來做你所要求的。所以你將不得不模擬它。

使用SetConsoleMode()啓用ENABLE_QUICK_EDIT_MODE以啓用用鼠標選擇文本。然後使用SendInput()mouse_event()來根據需要操縱鼠標移動和點擊。

使用GetConsoleWindow()來獲得控制檯的HWNDGetWindowRect()在屏幕上的位置。使用GetConsoleScreenBufferInfo/Ex()可獲取控制檯的列/行數,以及控制檯窗口中出現字符的矩形。然後,當發送鼠標動作時,您應該能夠使用一些數學方法將字符列/行偏移轉換爲屏幕座標。

+0

那麼,這是一種方法。只是好奇,因爲控制檯[可以處理鼠標事件](https://msdn.microsoft.com/en-us/library/windows/desktop/ms685035(v = vs.85).aspx),有沒有一種方法來模擬那些而不是發送通用鼠標輸入? – c00000fd

+0

@ c00000fd:AFAIK,控制檯API只能*處理*鼠標事件,它不能*生成*它們。因此需要在控制檯以外的API鏈上更高。儘管你可能會將「WM_MOUSEMOVE」和「WM_LBUTTON(DOWN | UP)」消息直接發佈到控制檯窗口。或者使用UIAutomation在控制檯窗口上模擬鼠標輸入。 –

+0

我會將其標記爲「各種各樣的解決方案」。通過'SendInput'發送直接輸入到控制檯是有效的,但是非常笨拙和不可靠(即,當調用SendInput時,它取決於控制檯窗口的鍵盤焦點)。 – c00000fd

0

使用ReadConsoleOutput讀取要選擇的區域。更改每個字符的接收CHAR_INFO屬性以反映不同(例如反轉)的顏色。使用WriteConsoleOutput將修改後的數據寫入同一個矩形區域。這將顯示一個「選定」區域。如果需要,使用SetConsoleCursorPosition更改光標位置。一個示例如何使用ReadConsoleOutput和WriteConsoleOutput可以看到here

+0

是的。這只是爲了突出顯示。我詢問了在控制檯通過'SetConsoleMode'放入'ENABLE_QUICK_EDIT_MODE'後通常用鼠標完成的選擇模擬。 – c00000fd

相關問題