Как отключить выбор пользователя в консоли Windows

Мне нужно отключить выбор мыши пользователем в консоли Windows. Возможно ли это и как? Я попробовал функцию SetConsoleMode(), чтобы отключить ввод с помощью мыши, но это не сработало, как я ожидал. Выбор был еще возможен.


person seqedugi    schedule 04.10.2017    source источник
comment
Это то, что вам действительно нужно, или это просто то, что вы считаете своим решением? Это действительно похоже на проблему XY. И даже если это не так, этот параметр остается на усмотрение пользователя.   -  person IInspectable    schedule 04.10.2017
comment
Я предполагаю, что вы говорите об использовании мыши для операций типа «вырезать и копировать»? Я думаю, что все, что вы можете контролировать с помощью SetConsoleMode(), это то, могут ли события мыши быть прочитаны программой. Я не знаю, можно ли управлять копированием консоли с помощью вызова API; даже если это так, я подозреваю, что это может варьироваться в зависимости от выпуска Windows.   -  person Kevin Boone    schedule 04.10.2017
comment
@Ron: Этот флаг определяет, получаете ли вы уведомления о вводе с помощью мыши в консоли. Это не меняет того, как сама консоль реагирует на ввод с помощью мыши.   -  person IInspectable    schedule 04.10.2017
comment
@IInspectable Верно. Я исправляюсь.   -  person Ron    schedule 04.10.2017
comment
@eryksun Да, это работает, спасибо.   -  person seqedugi    schedule 05.10.2017


Ответы (1)


Режим быстрого редактирования консоли позволяет пользователю быстро выделять и копировать текст с помощью мыши без необходимости сначала входить в режим пометки (например, Ctrl+M или в меню Правка -> Отметить). Обычно удобно включать режим быстрого редактирования, но он мешает вводу данных с помощью мыши. Вы можете отключить его, используя дескриптор буфера ввода консоли следующим образом:

DWORD prev_mode;
GetConsoleMode(hInput, &prev_mode); 
SetConsoleMode(hInput, ENABLE_EXTENDED_FLAGS | 
    (prev_mode & ~ENABLE_QUICK_EDIT_MODE));

Не забудьте восстановить предыдущий режим при выходе.

person Eryk Sun    schedule 05.10.2017
comment
Это не работает на подключенной консоли. I `AllocConsole(); AttachConsole(GetCurrentProcessId());` Я хочу отключить выбор или любой ввод, чтобы невозможно было никакое взаимодействие или выбор с окнами консоли. - person Zingam; 22.05.2019
comment
@Zingam, похоже, вы хотите отключить все формы ввода; используйте SetConsoleMode(hInput, ENABLE_EXTENDED_FLAGS), что отключит все режимы ввода. К вашему сведению, AllocConsole выделяет консоль и присоединяется к ней. Не звони AttachConsole; вызов, вероятно, все равно не работает, потому что процесс уже подключен к консоли. - person Eryk Sun; 23.05.2019
comment
Вы должны получить дескриптор с помощью CreateFile (CONIN $), а не с помощью GetConsoleWindow - например. HANDLE hInput = CreateFileW(LCONIN$, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); - person Den-Jason; 05.03.2020
comment
@ Ден-Джейсон, сначала попробуй GetStdHandle(STD_INPUT_HANDLE). Если этот дескриптор приводит к сбою GetConsoleMode с ERROR_INVALID_HANDLE, вы можете вернуться к открытию CONIN$. К вашему сведению, GetConsoleWindow возвращает дескриптор окна консоли, если в консоли есть окно, которого может и не быть. Дескриптор окна относится к объекту окна в оконном менеджере, а не к файловому объекту в ядре. - person Eryk Sun; 06.03.2020
comment
@ErykSun Хорошо, заметил. Использование открытия CONIN$ основано на ответе на вопрос MSDN, как использовать ReadConsole() для чтения клавиши ввода или любой клавиши - person Den-Jason; 06.03.2020