Мне нужно отключить выбор мыши пользователем в консоли Windows. Возможно ли это и как? Я попробовал функцию SetConsoleMode()
, чтобы отключить ввод с помощью мыши, но это не сработало, как я ожидал. Выбор был еще возможен.
Как отключить выбор пользователя в консоли Windows
Ответы (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
Это не работает на подключенной консоли. I `AllocConsole(); AttachConsole(GetCurrentProcessId());` Я хочу отключить выбор или любой ввод, чтобы невозможно было никакое взаимодействие или выбор с окнами консоли.
- person Zingam; 22.05.2019
@Zingam, похоже, вы хотите отключить все формы ввода; используйте
SetConsoleMode(hInput, ENABLE_EXTENDED_FLAGS)
, что отключит все режимы ввода. К вашему сведению, AllocConsole
выделяет консоль и присоединяется к ней. Не звони AttachConsole
; вызов, вероятно, все равно не работает, потому что процесс уже подключен к консоли.
- person Eryk Sun; 23.05.2019
Вы должны получить дескриптор с помощью 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
@ Ден-Джейсон, сначала попробуй
GetStdHandle(STD_INPUT_HANDLE)
. Если этот дескриптор приводит к сбою GetConsoleMode
с ERROR_INVALID_HANDLE
, вы можете вернуться к открытию CONIN$. К вашему сведению, GetConsoleWindow
возвращает дескриптор окна консоли, если в консоли есть окно, которого может и не быть. Дескриптор окна относится к объекту окна в оконном менеджере, а не к файловому объекту в ядре.
- person Eryk Sun; 06.03.2020
@ErykSun Хорошо, заметил. Использование открытия CONIN$ основано на ответе на вопрос MSDN, как использовать ReadConsole() для чтения клавиши ввода или любой клавиши
- person Den-Jason; 06.03.2020
SetConsoleMode()
, это то, могут ли события мыши быть прочитаны программой. Я не знаю, можно ли управлять копированием консоли с помощью вызова API; даже если это так, я подозреваю, что это может варьироваться в зависимости от выпуска Windows. - person Kevin Boone   schedule 04.10.2017