2016-06-21 146 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

相关问题