Как закрыть / открыть консоль в C # с помощью вызовов Win32?
Следующая программа выдает ошибку «Console.ReadKey ()».
Как повторно включить консоль после ее отключения?
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem((o) =>
{
Thread.Sleep(1000);
IntPtr stdin = GetStdHandle(StdHandle.Stdin);
CloseHandle(stdin);
});
Console.ReadLine();
Console.Write("ReadLine() successfully aborted by background thread.\n");
Console.Write("[any key to exit]");
Console.ReadKey(); // Throws an exception "Cannot read keys when either application does not have a console or when console input has been redirected from a file. Try Console.Read."
}
// P/Invoke:
private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle(StdHandle std);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hdl);
}
}
Дополнительно для экспертов
Если вам интересно, мне нужно иметь возможность убить фоновый поток, выполняющий ReadLine (), в C #. Похоже, это единственный способ (thread.Abort не будет работать, потому что ReadLine () работает глубоко внутри недр операционной системы, в неуправляемом коде). На StackOverflow много говорят на эту тему, никто еще не нашел (или не опубликовал) удовлетворительный метод прерывания Console.ReadLine (). Я думаю, что этот код находится на правильном пути - если только мы сможем повторно включить консоль после ее отключения.