次のプログラムは、Console.ReadKey()でエラーをスローします。Win32呼び出しを使用してC#内でコンソールを閉じる/開く方法は?
コンソールを無効にした後、コンソールを再び有効にするにはどうすればよいですか?専門家
エキストラ
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);
}
}
あなたが迷っている場合は、私はC#内ReadLineメソッドを()、実行中のバックグラウンドスレッドを殺すことができるようにする必要があります。これは唯一の方法です(ReadLine()はオペレーティングシステムの内部で、アンマネージコードで深く実行されるためthreadAbortは機能しません)。 StackOverflowにはこのトピックに関する話がたくさんありますが、誰も実際にConsole.ReadLine()を中止する満足のいく方法を発見(または投稿)していません。私は、このコードが正しい軌道にあると思う - もしそれを無効にした後にコンソールを再び有効にできるのであれば。
ハンドルを閉じると、手でもう一度開く必要があります。ハンドルを閉じただけで、同じハンドルを再び使用できる保証はありません。正しいハンドルを閉じてもよろしいですか?私は、Readlineを中止して標準入力の血まみれのハンドルを閉じるより簡単な方法があると信じなければなりません。 –
@Ramhound私はReadLineを中止する簡単な方法があったと思う。私はすべてを試してみました - .Abort、アプリケーションにキーを送る(現在のフォーカスのためだけに働く)など。より良い方法があれば、私はすべて耳にします。 – Contango
@Ramhound私が考えることができる唯一の他の方法は、100%管理されたC#でReadLineのクローンを作成することです.Abortは動作しますが、Win32コードの数行に比べて確かに複雑です。 – Contango