我在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进行。
有什么帮助吗?
谢谢 海梅
答案 0 :(得分:0)
使用Control.KeyDown
事件。
关键事件按以下顺序发生:
根据文档KeyDown occurs when a key is pressed while the control has focus.
因此,如果您不在TextBox
内,则不会发现任何问题,但是您也可以修复该问题。
如果您想捕获FOCUSED表单内按下的任何键,只需设置yourForm.KeyPreview = true
,只要表单处于焦点位置(不是表单内的特定控件),它将捕获任何按下的键
请注意,如果您只想在文本框内听键,请将事件附加到文本框,如果您想在格式启用KeyPreview
的任何地方听键,并将KeyDown
事件附加到{ {1}}