【问题标题】:How to capture standard input in a Winforms application如何在 Winforms 应用程序中捕获标准输入
【发布时间】: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


【解决方案1】:

使用Control.KeyDown 事件。

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

  • 按键
  • 按键
  • KeyUp

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

因此,如果您不在 TextBox 内部,它不会捕获任何东西,但您也可以修复它。

如果您想捕捉在 FOCUSED 表单中按下的任何键,只需设置 yourForm.KeyPreview = true,只要表单处于焦点状态,它就会捕捉到按下的任何键(不是表单内的特定控件)

请注意,如果您只想在文本框内收听按键,请将事件附加到文本框,如果您想在表单中的任何位置收听按键,请启用KeyPreview 并将KeyDown 事件附加到Form

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2015-04-28
    • 2021-10-20
    • 2013-05-11
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多