在64位中禁用QuickEditMode

时间:2019-02-01 09:23:31

标签: c# .net windows 64-bit 32bit-64bit

我目前使用在老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

我用Google搜索并检查了64位Windows上的dll是否也命名为kernel32.dll。.我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

我不确定假设控制台句柄的值始终为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);