如何以编程方式禁用C#Console应用程序的快速编辑模式?

我试过几个解决方案,比如一个 – >

http://www.pcreview.co.uk/forums/console-writeline-hangs-if-user-click-into-console-window-t1412701.html

但是,我观察到GetConsoleMode(IntPtr hConsoleHandle,out int模式)中的模式对于不同的控制台应用程序将是不同的。 它不是恒定的。

我是否可以在控制台应用程序上禁用鼠标单击(右/左按钮)以实现相同的方案。 我发现它可以用IMessageFilter完成,但仅适用于Window Form Application而不适用于控制台应用程序。

请指导。

如果要禁用快速编辑模式,则需要调用GetConsoleMode以获取当前模式。 然后清除启用快速编辑的位,并调用SetConsoleMode 。 假设您拥有非托管函数的托管原型,您可以编写:

const int ENABLE_QUICK_EDIT = 0x0040; IntPtr consoleHandle = GetConsoleWindow(); UInt32 consoleMode; // get current console mode if (!GetConsoleMode(consoleHandle, out consoleMode)) { // Error: Unable to get console mode. return; } // Clear the quick edit bit in the mode flags mode &= ~ENABLE_QUICK_EDIT; // set the new mode if (!SetConsoleMode(consoleHandle, consoleMode)) { // ERROR: Unable to set console mode } 

如果要禁用鼠标输入,则需要清除鼠标输入位。

 const int ENABLE_MOUSE_INPUT = 0x0010; mode &= ~ENABLE_MOUSE_INPUT; 

对于像我这样喜欢复制/粘贴的简单代码的人来说,这里的代码灵感来自于已接受的答案:

 using System; using System.Runtime.InteropServices; static class DisableConsoleQuickEdit { const uint ENABLE_QUICK_EDIT = 0x0040; // STD_INPUT_HANDLE (DWORD): -10 is the standard input device. const int STD_INPUT_HANDLE = -10; [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll")] static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll")] static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); internal static bool Go() { IntPtr consoleHandle = GetStdHandle(STD_INPUT_HANDLE); // get current console mode uint consoleMode; if (!GetConsoleMode(consoleHandle, out consoleMode)) { // ERROR: Unable to get console mode. return false; } // Clear the quick edit bit in the mode flags consoleMode &= ~ENABLE_QUICK_EDIT; // set the new mode if (!SetConsoleMode(consoleHandle, consoleMode)) { // ERROR: Unable to set console mode return false; } return true; } } 

通过使用下面的代码组合,我可以启用或禁用快速编辑模式。

 const int ENABLE_QUICK_EDIT = 0x0040; // STD_INPUT_HANDLE (DWORD): -10 is the standard input device. const int STD_INPUT_HANDLE = -10; [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll")] static extern bool GetConsoleMode(IntPtr hConsoleHandle, out int lpMode); [DllImport("kernel32.dll")] static extern bool SetConsoleMode(IntPtr hConsoleHandle, int dwMode); 

要启用,只需执行currentConsoleMode &= ENABLE_QUICK_EDIT;

要禁用,请执行currentConsoleMode &= ~ENABLE_QUICK_EDIT

然后调用SetConsoleMode