我目前使用在老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。.我在这里缺少什么?
答案 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);