我已经创建了一个Windows窗体应用程序。在特殊情况下,我打开一个控制台窗口
public static void CreateConsole() {
AllocConsole();
}
[DllImport("kernel32")]
private static extern bool AllocConsole();当我打电话给Console.ReadKey()后,我得到了一个InvalidOperationException
当应用程序没有控制台或控制台输入已从文件重定向时,无法读取键。试试Console.Read。
当我使用Console.Read()时,它将无法工作。没有击键被识别。
有人能帮我吗,这里有什么问题吗?谢谢。
发布于 2021-06-10 23:38:35
如您所见,输出转到Visual控制台,而不是打开控制台。要解决这个问题,您需要重新打开控制台输出流:
if (AllocConsole())
{
var outHandle = CreateFile("CONOUT$",
(uint)(FileConsts.FILE_GENERIC_WRITE | FileConsts.FILE_GENERIC_READ),
(uint)(FileConsts.FILE_SHARE_WRITE | FileConsts.FILE_SHARE_READ),
0,
FileConsts.OPEN_EXISTING,
FileConsts.FILE_ATTRIBUTE_NORMAL, 0);
var inHandle = CreateFile("CONIN$",
(uint)(FileConsts.FILE_GENERIC_WRITE | FileConsts.FILE_GENERIC_READ),
(uint)(FileConsts.FILE_SHARE_WRITE | FileConsts.FILE_SHARE_READ),
0,
FileConsts.OPEN_EXISTING,
FileConsts.FILE_ATTRIBUTE_NORMAL, 0);
if (!SetStdHandle(STD_OUTPUT_HANDLE, outHandle))
throw new Exception("Can't set std handle");
if (!SetStdHandle(STD_INPUT_HANDLE, inHandle))
throw new Exception("Can't set std handle");
//Just for handle .Dispose();
var fileStream = new FileStream(new SafeFileHandle(outHandle, true), FileAccess.Write);
var fileStreamRead = new FileStream(new SafeFileHandle(inHandle, true), FileAccess.Read);
ConsoleKey read;
while ((read = Console.ReadKey().Key) != ConsoleKey.Escape)
{
Console.WriteLine($"Printed {read}");
}
Console.WriteLine("Escape Pressed, exiting");
SetStdHandle(STD_INPUT_HANDLE, IntPtr.Zero);
SetStdHandle(STD_OUTPUT_HANDLE, IntPtr.Zero);
fileStream.Dispose();
fileStreamRead.Dispose();
FreeConsole();
}请注意,new FileStream("CONOUT$", ...)和Console.OpenStandardInput()不能工作。我刚刚用Windows.Forms应用程序测试了它。Console.ReadKey对我来说是正确的。创建文件和常量来自kernel32.dll
https://stackoverflow.com/questions/67640707
复制相似问题