【发布时间】:2018-12-25 07:24:35
【问题描述】:
我有一个 C# 表单,我需要在其中捕获标准输入。
到目前为止我有这个代码(取自https://daveaglick.com/posts/capturing-standard-input-in-csharp):
string stdin = null;
if (Console.IsInputRedirected)
{
using (Stream stream = Console.OpenStandardInput())
{
byte[] buffer = new byte[1000]; // Use whatever size you want
StringBuilder builder = new StringBuilder();
int read = -1;
while (true)
{
AutoResetEvent gotInput = new AutoResetEvent(false);
Thread inputThread = new Thread(() =>
{
try
{
read = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine("LEIDO " + read.ToString());
Console.WriteLine("CON CONSOLE.IN ->" + Console.In.ReadLine() + "<-");
gotInput.Set();
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
})
{
IsBackground = true
};
inputThread.Start();
// Timeout expired?
if (!gotInput.WaitOne(100))
{
inputThread.Abort();
Console.WriteLine("ABORTADO!!!");
break;
}
// End of stream?
if (read == 0)
{
stdin = builder.ToString();
ProcessInput(stdin);
Console.WriteLine("LEYÓ ->" + stdin + "<-");
break;
}
// Got data
builder.Append(Console.InputEncoding.GetString(buffer, 0, read));
}
}
}
问题是,即使我按下任意键,调用“stream.Read()”方法也不会读取数据。
我已尝试使用 Console.In.ReadLine() 和 Console.ReadLine() 但没有任何效果。
但是,如果我在窗体中放置一个 TextBox 控件,并将焦点移到该控件上,则任何按下的键都会写入 TextBox。
我需要在发送到 TextBox 之前捕获键盘键。
顺便说一句,Form.KeyPress 属性在我的情况下不是一个选项,但以防万一,我已将其设置为 true,但它也不起作用。
表单键事件也不是选项,因为所有这些调用都应该由我动态加载的外部 DLL 进行。
有什么帮助吗?
谢谢 詹姆
【问题讨论】:
-
标准输入与你想要什么无关;这仅用于控制台/重定向。
-
Console是用于操作命令行的类,而不是 windows 窗体 -
@SLaks 我猜到了。那么,如何在 Winforms 应用程序中捕获键盘输入?
标签: c# winforms keyboard keyboard-events