Подтвердить что ты не робот

Как программно отключить режим быстрого редактирования С# Console?

Я попытался найти несколько найденных решений, например, один →

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

Но я заметил, что режим в GetConsoleMode (IntPtr hConsoleHandle, out int mode) будет отличаться для разных консольных приложений. Он не является постоянным.

Могу ли я отключить щелчки мыши (правые/левые кнопки) в консольном приложении для достижения того же сценария. Я обнаружил, что это можно сделать с помощью IMessageFilter, но только для приложения Window Form, а не для консольного приложения.

Пожалуйста, направляйте.

4b9b3361

Ответ 1

Если вы хотите отключить режим быстрого редактирования, вам нужно вызвать 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;

Ответ 2

Для таких, как я, которые, как и без проблем, для копирования/вставки, вот код, вдохновленный принятым ответом:

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

Ответ 3

Прочитав приведенные выше ответы, GetConsoleWindow() использовать нельзя. Вместо этого необходимо использовать GetStdHandle().

Итак, вот класс копирования и вставки для включения/отключения QuickEditMode. Вызовите ConsoleWindow.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);
    }
}

Ответ 4

Используя приведенную ниже комбинацию кодов, я могу включить или отключить режим быстрого редактирования.

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.

Ответ 5

Я только что наткнулся на ту же проблему с режимом быстрого редактирования, включенным в моем консольном приложении, которое написано на C и работает под Windows 7 32-разрядной версии целую вечность. После портирования (ну, в действительности, не портирования, но адаптации некоторых строк кода) к Windows 10 64 Bit (все еще будучи 32-битным приложением), я наблюдал такое же поведение. Поэтому я искал решение.

Но по неизвестной мне причине код работает наоборот, т.е. установка бита ENABLE_QUICK_EDIT_MODE в параметре 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);
}

Привет Вольфганг