Отключить QuickEditMode в 64 бит - PullRequest
       34

Отключить QuickEditMode в 64 бит

0 голосов
/ 01 февраля 2019

В настоящее время я использую следующий код в старых окнах 32-битной архитектуры:

    [DllImport("kernel32.dll", EntryPoint = "SetConsoleMode", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint mode);
    [DllImport("kernel32.dll", EntryPoint = "GetConsoleMode", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
    [DllImport("user32.dll")]
    public static extern bool EnableMenuItem(IntPtr hConsoleHandle, uint uIDEnableItem, uint uEnable);
    [DllImport("user32.dll")]
    public static extern IntPtr GetSystemMenu(IntPtr hSystemMenu, bool bRevert);
    [DllImport("user32.dll")]
    public static extern IntPtr RemoveMenu(IntPtr hSystemMenu, uint nPosition, uint wFlags);

Это код, который использует GetConsoleMode и SetConsoleMode:

if (!GetConsoleMode(consoleHandle, out consoleMode))
                throw new IOException("Console setup error - failed to retrieve current ConsoleMode");
consoleMode &= ~Constants.ENABLE_QUICK_EDIT_MODE;
Constants.SetConsoleMode(consoleHandle, consoleMode)

Я знаю, попробуйтечтобы приложение работало на 64-битной машине, но я получаю эту ошибку:

Type: System.IO.IOException
Message: Console setup error - failed to retrieve current ConsoleMode

Я погуглил и проверил, что dll на 64-битных окнах также называется kernel32.dll .. Чего мне не хватаетздесь

1 Ответ

0 голосов
/ 01 февраля 2019

Я не уверен, что стоит предположить, что дескриптор консоли всегда имеет значение 0x3, тем более что есть метод Windows API для извлечения стандартных дескрипторов.

Кажется, что работает следующеепри запуске как 32-битного и 64-битного исполняемого файла (на 64-битной Windows), так и .NET делает это внутренне:

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

var consoleHandle = GetStdHandle(-10); // STD_INPUT_HANDLE
GetConsoleMode(consoleHandle, out var mode);
...