如何在Winforms应用程序中捕获标准输入

时间:2018-07-17 14:29:43

标签: c# winforms keyboard keyboard-events

我在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进行。

有什么帮助吗?

谢谢 海梅

1 个答案:

答案 0 :(得分:0)

使用Control.KeyDown事件。

关键事件按以下顺序发生:

  • KeyDown
  • KeyPress
  • KeyUp

根据文档KeyDown occurs when a key is pressed while the control has focus.

因此,如果您不在TextBox内,则不会发现任何问题,但是您也可以修复该问题。

如果您想捕获FOCUSED表单内按下的任何键,只需设置yourForm.KeyPreview = true,只要表单处于焦点位置(不是表单内的特定控件),它将捕获任何按下的键

请注意,如果您只想在文本框内听键,请将事件附加到文本框,如果您想在格式启用KeyPreview的任何地方听键,并将KeyDown事件附加到{ {1}}