如何在Windows控制台中禁用用户选择

3

我需要在Windows控制台中禁用用户鼠标选择。这是否可能?如何实现?我尝试使用函数SetConsoleMode()来禁用鼠标输入,但它并没有像我预期的那样起作用。选择仍然是可能的。


1
这是你真正需要的吗,还是你认为这是你的解决方案?这真的很像一个XY问题。即使不是这样,这个设置也由用户自行决定。 - IInspectable
我猜你在说使用鼠标进行剪切和复制操作吧?我认为SetConsoleMode()只能控制程序是否可以读取鼠标事件。我不知道通过API调用是否可以控制控制台的剪切和复制操作,即使可以,我怀疑它可能会因Windows版本而异。 - Kevin Boone
@Ron:该标志控制是否在控制台中接收鼠标输入通知。它不会改变控制台本身对鼠标输入的响应方式。 - IInspectable
@IInspectable 确实。我承认错误。 - Ron
@eryksun 是的,它工作了,谢谢。 - seqedugi
1个回答

6

控制台的快速编辑模式允许用户使用鼠标快速选择和复制文本,无需首先进入标记模式(即Ctrl+M,或在菜单上选择“编辑” -> “标记”)。启用快速编辑模式通常很方便,但它会干扰鼠标输入。您可以使用控制台输入缓冲区的句柄来禁用它,方法如下:

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

记得在退出时恢复之前的模式。


这在附加控制台上不起作用。我想要禁用选择或任何输入,以便不可能与控制台窗口进行交互或选择。 - Zingam
@Zingam,看起来你想禁用所有输入方式;使用 SetConsoleMode(hInput, ENABLE_EXTENDED_FLAGS),它将禁用所有输入模式。顺便说一下,AllocConsole 分配并附加到控制台。不要调用 AttachConsole;该调用可能会失败,因为进程已经附加到一个控制台。 - Eryk Sun
你必须使用CreateFile(CONIN$)来获取句柄,而不是使用GetConsoleWindow - 例如:"HANDLE hInput = CreateFileW(L"CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); - Den-Jason
1
@Den-Jason,首先尝试使用GetStdHandle(STD_INPUT_HANDLE)。如果该句柄导致GetConsoleMode失败并显示ERROR_INVALID_HANDLE错误,那么你可以回退到打开"CONIN$"。顺便提一下,如果控制台有窗口的话,GetConsoleWindow会返回控制台窗口的句柄,但也可能没有窗口。窗口句柄指的是窗口管理器中的窗口对象,而不是内核中的文件对象。 - Eryk Sun
@ErykSun 好的,知道了。使用打开CONIN$是基于MSDN问题的答案,“如何使用ReadConsole()来读取回车键或任意键”。 - Den-Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接