Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编程禁用C#控制台应用程序';什么是快速编辑模式?_C#_Console Application - Fatal编程技术网

如何编程禁用C#控制台应用程序';什么是快速编辑模式?

如何编程禁用C#控制台应用程序';什么是快速编辑模式?,c#,console-application,C#,Console Application,一、 我尝试了几种解决方案,比如-> 但是,我观察到GetConsoleMode中的模式(IntPtr hConsoleHandle,out int mode)对于不同的控制台应用程序是不同的。它不是常数 我可以在控制台应用程序上禁用鼠标单击(右/左按钮)以实现相同的场景吗。我发现它可以用IMessageFilter来完成,但只适用于窗口窗体应用程序,而不适用于控制台应用程序 请指导。如果要禁用快速编辑模式,您需要呼叫以获取当前模式。然后清除启用快速编辑的位,然后调用。假设您拥有非托管函数的托

一、 我尝试了几种解决方案,比如->

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

我可以在控制台应用程序上禁用鼠标单击(右/左按钮)以实现相同的场景吗。我发现它可以用IMessageFilter来完成,但只适用于窗口窗体应用程序,而不适用于控制台应用程序


请指导。

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

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;

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

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\u QUICK\u EDIT

要禁用,请执行以下操作:
currentConsoleMode&=~启用快速编辑


然后调用SetConsoleMode

对于像我这样喜欢复制/粘贴无需思考的代码的人,下面是从公认答案中得到启发的代码:

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;
   }
}

阅读了以上答案后,无法使用GetConsoleWindow()。相反,必须使用GetStdHandle()

这里有一个用于启用/禁用QuickEditMode的复制粘贴类。调用控制台窗口QuickEditMode(false)禁用控制台窗口的快速编辑模式

using System;
using System.Runtime.InteropServices;

public static class ConsoleWindow
{
    private static class NativeFunctions
    {
        public enum StdHandle : int
        {
            STD_INPUT_HANDLE = -10,
            STD_OUTPUT_HANDLE = -11,
            STD_ERROR_HANDLE = -12,
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr GetStdHandle(int nStdHandle); //returns Handle

        public enum ConsoleMode : uint
        {
            ENABLE_ECHO_INPUT = 0x0004,
            ENABLE_EXTENDED_FLAGS = 0x0080,
            ENABLE_INSERT_MODE = 0x0020,
            ENABLE_LINE_INPUT = 0x0002,
            ENABLE_MOUSE_INPUT = 0x0010,
            ENABLE_PROCESSED_INPUT = 0x0001,
            ENABLE_QUICK_EDIT_MODE = 0x0040,
            ENABLE_WINDOW_INPUT = 0x0008,
            ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200,

            //screen buffer handle
            ENABLE_PROCESSED_OUTPUT = 0x0001,
            ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002,
            ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004,
            DISABLE_NEWLINE_AUTO_RETURN = 0x0008,
            ENABLE_LVB_GRID_WORLDWIDE = 0x0010
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
    }

    public static void QuickEditMode(bool Enable)
    {
        //QuickEdit lets the user select text in the console window with the mouse, to copy to the windows clipboard.
        //But selecting text stops the console process (e.g. unzipping). This may not be always wanted.
        IntPtr consoleHandle = NativeFunctions.GetStdHandle((int)NativeFunctions.StdHandle.STD_INPUT_HANDLE);
        UInt32 consoleMode;

        NativeFunctions.GetConsoleMode(consoleHandle, out consoleMode);
        if (Enable)
            consoleMode |= ((uint)NativeFunctions.ConsoleMode.ENABLE_QUICK_EDIT_MODE);
        else
            consoleMode &= ~((uint)NativeFunctions.ConsoleMode.ENABLE_QUICK_EDIT_MODE);

        consoleMode |= ((uint)NativeFunctions.ConsoleMode.ENABLE_EXTENDED_FLAGS);

        NativeFunctions.SetConsoleMode(consoleHandle, consoleMode);
    }
}

我只是碰巧遇到了同样的问题,在我的控制台应用程序中启用了快速编辑模式,该应用程序是用C编写的,并且已经在Windows7 32位下工作了很长时间。在将它移植到64位windows 10(仍然是一个32位应用程序)之后(不是真正的移植,而是修改了一些代码行),我观察到了相同的行为。 所以我寻找解决办法

但由于我不知道的原因,代码的工作方式正好相反,即在模式参数中设置位
ENABLE\u QUICK\u EDIT\u MODE
,实际上会禁用快速编辑模式。重置位可启用快速编辑模式

这是我的密码:

    /// <summary>
/// This flag enables the user to use the mouse to select and edit text. To enable
/// this option, you must also set the ExtendedFlags flag.
/// </summary>
const int QuickEditMode = 64;

// ExtendedFlags must be combined with
// InsertMode and QuickEditMode when setting
/// <summary>
/// ExtendedFlags must be enabled in order to enable InsertMode or QuickEditMode.
/// </summary>
const int ExtendedFlags = 128;

BOOLEAN EnableQuickEdit()
{
    HWND conHandle = GetStdHandle(STD_INPUT_HANDLE);
    int mode;
    DWORD dwLastError = GetLastError();
    if (!GetConsoleMode(conHandle, &mode))
    {
        // error getting the console mode. Exit.
        dwLastError = GetLastError();
        return (dwLastError == 0);
    }
    else 
        dwLastError = 0;
    mode = mode & ~QuickEditMode;

    if (!SetConsoleMode(conHandle, mode | ExtendedFlags))
    {
        // error setting console mode.
        dwLastError = GetLastError();
    }
    else
        dwLastError = 0;
    return (dwLastError == 0);
}

BOOLEAN DisableQuickEdit()
{
    HWND conHandle = GetStdHandle(STD_INPUT_HANDLE);
    int mode;
    DWORD dwLastError = GetLastError();

    if (!GetConsoleMode(conHandle, &mode))
    {
        // error getting the console mode. Exit.
        dwLastError = GetLastError();
        return (dwLastError == 0);
    }
    else
        dwLastError = 0;

    mode = mode | QuickEditMode;

    if (!SetConsoleMode(conHandle, mode))
    {
        // error getting the console mode. Exit.
        dwLastError = GetLastError();
    }
    else
        dwLastError = 0;
    return (dwLastError == 0);
}
//
///此标志允许用户使用鼠标选择和编辑文本。使能
///如果选择此选项,还必须设置ExtendedFlags标志。
/// 
常量int QuickEditMode=64;
//ExtendedFlags必须与
//设置时的InsertMode和QuickEditMode
/// 
///必须启用ExtendedFlags才能启用InsertMode或QuickEditMode。
/// 
const int ExtendedFlags=128;
布尔启用QuickEdit()
{
HWND conHandle=GetStdHandle(标准输入句柄);
int模式;
DWORD dwLastError=GetLastError();
if(!GetConsoleMode(控制手柄和模式))
{
//获取控制台模式时出错。退出。
dwLastError=GetLastError();
返回值(dwLastError==0);
}
其他的
dwLastError=0;
模式=模式&~QuickEditMode;
如果(!SetConsoleMode(conHandle,模式|扩展标志))
{
//设置控制台模式时出错。
dwLastError=GetLastError();
}
其他的
dwLastError=0;
返回值(dwLastError==0);
}
BOOLEAN DisableQuickEdit()
{
HWND conHandle=GetStdHandle(标准输入句柄);
int模式;
DWORD dwLastError=GetLastError();
if(!GetConsoleMode(控制手柄和模式))
{
//获取控制台模式时出错。退出。
dwLastError=GetLastError();
返回值(dwLastError==0);
}
其他的
dwLastError=0;
模式=模式|快速编辑模式;
如果(!SetConsoleMode(控制手柄,模式))
{
//获取控制台模式时出错。退出。
dwLastError=GetLastError();
}
其他的
dwLastError=0;
返回值(dwLastError==0);
}

问候Wolfgang

据我所知,默认情况下它是关闭的,如果用户想启用它,那么你会告诉谁不同?事实上,昨天发生了相同的情况,我们的一个基于控制台的C#应用程序作为服务器上线。来自实施团队的一些人可能错误地打开了快速编辑模式&而不是无意中点击窗口。这会冻结UI线程。花了两个小时的时间才真正发现问题不是技术性的谢谢你,这正是我想要的。@M.Babcock:是的,这就是链接代码试图做的。但是链接代码得到的是标准输入句柄,而不是控制台窗口句柄(可能不同)。它还硬编码控制台模式,可以改变许多不同的设置。此代码仅更改一个设置。@Jim Mischel-使用IntPtr consoleHandle=GetConsoleWindow()会导致处于if条件下,然后返回。所以我使用了public const int STD_INPUT_HANDLE=-10;IntPtr句柄=GetStdHandle(标准输入句柄);GetConsoleMode(handle,out consoleMode)以获取模式。有什么我遗漏的吗?这是一点以前的事了,但有一些额外的提示:有重要信息:要禁用QuickEdit模式,必须在SetConsole上设置扩展标志。如果在不使用QUICK&不使用EXTENDED的情况下调用SetConsole:标志将更改,但quickedit仍处于启用状态。禁用:模式&=~启用快速编辑;模式|=启用扩展标志;否决投票人:通常会提供否决投票的理由。这个答案有问题吗?这太完美了!绝对完美!这正是我一直在寻找的。非常感谢。