Chương trình sau ném lỗi trên "Console.ReadKey()".Làm cách nào để đóng/mở bàn điều khiển trong C# bằng các cuộc gọi Win32?
Làm cách nào để bật lại bảng điều khiển sau khi vô hiệu hóa bảng điều khiển?
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);
}
}
tắm cho chuyên gia
Nếu bạn đang tự hỏi, tôi cần để có thể giết một sợi nền chạy ReadLine(), trong C#. Điều này dường như là cách duy nhất (thread.Abort sẽ không hoạt động vì ReadLine() chạy sâu bên trong ruột của hệ điều hành, trong mã không được quản lý). Có rất nhiều thảo luận về chủ đề này trên StackOverflow, không ai thực sự phát hiện (hoặc được đăng) một phương pháp thỏa đáng để hủy bỏ Console.ReadLine(). Tôi nghĩ rằng mã này đang đi đúng hướng - nếu chúng tôi chỉ có thể bật lại bảng điều khiển sau khi tắt nó.
Nếu bạn đóng Xử lý ... Bạn sẽ phải bằng tay mở lại. Xem xét bạn chỉ cần đóng xử lý không có gurantee bạn có thể sử dụng cùng một xử lý một lần nữa. Bạn có chắc là bạn đóng đúng xử lý? Tôi phải tin rằng có một cách dễ dàng hơn để hủy bỏ một Readline sau đó để đóng xử lý đẫm máu của đầu vào tiêu chuẩn. –
@Ramhound Tôi ước rằng có một cách dễ dàng hơn để hủy bỏ ReadLine. Tôi đã cố gắng tất cả mọi thứ - .Abort, gửi các phím đến ứng dụng (chỉ hoạt động cho tiêu điểm hiện tại), vv Nếu có cách nào tốt hơn, tôi là tất cả các tai. – Contango
@Ramhound Cách duy nhất khác tôi có thể nghĩ đến là viết một bản sao của ReadLine trong 100% được quản lý C#, vì vậy .Abort sẽ hoạt động, chắc chắn phức tạp hơn so với một vài dòng mã Win32. – Contango