2016-06-21 3 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 –

+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(), чтобы получить консоль HWND и GetWindowRect(), чтобы получить ее положение на экране. Используйте 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

Да. Это просто для подсветки. Я прошу об эмуляции выделения, которое обычно делается с помощью мыши после того, как консоль помещается в 'ENABLE_QUICK_EDIT_MODE' с помощью' SetConsoleMode'. – c00000fd

Смежные вопросы