如何从WPF应用程序中的标准输入读取?

时间:2009-03-17 19:13:02

标签: .net wpf stdin

我正在试图弄清楚如何从我自己的WPF应用程序的标准输入流中读取,但我找不到获取流的方法。标准的方法,

Console.ReadLine()

立即返回Null(Nothing)。我假设因为它不是控制台应用程序而且没有打开控制台窗口。如何从WPF应用程序中的标准输入读取?

一些背景:我正在尝试读取由外部设备(磁卡读卡器)发送的文本,该设备将其数据发送到当前关注应用程序的标准输入。我可以将焦点放在TextBox上然后从那里读取数据,如果必须的话,我宁愿直接读取数据,以避免一系列可能的问题。

编辑:尽管Daniel Pratt解决了我原来的问题,但仍然很高兴弄清楚如何从stdin读取。如果你能回答,我会改变接受的答案。

3 个答案:

答案 0 :(得分:3)

我的印象是这种类型的设备通常用作键盘(这将使原始问题中关于TextBox的部分有意义)。我想你只需要挂钩一些键盘事件。

答案 1 :(得分:0)

查看用于从stdin / stdout流读取/写入的.NET框架代码,看起来好像没有任何依赖于控制台窗口的事实。代码似乎只是使用各种本机Win32调用,首先是GetStdHandle来获取标准输入/输出流的句柄,并创建一个 __ ConsoleStream 类,它是Win32上的托管包装器< em> ReadFileNative 和 WriteFileNative 函数。实际上,我没有看到Console.ReadLine不应该起作用的任何原因...当你将代码直接放入时,检查使用 Console 从stdin读取的调用是否成功是值得的。 主要功能。我想这里的问题可能与Windows识别的应用程序类型有关,但我不明白为什么非控制台应用程序应该被限制从stdin读取/写入stdout。另一个可能的原因可能是您正在进行呼叫的线程。无论如何,请测试一下,让我知道结果。如果你还没有取得任何成功,我会尝试做一些自己的测试,因为我对解决方案很好奇。

答案 2 :(得分:0)

Console.ReadLine()适用于WPF应用程序,至少当我尝试通过命令行管道时。也许null是由读卡器的驱动程序明确发送的(可能意味着什么)。

对于像我一样的人来寻找一般的操作方法,这里有一个我所做的演示(假设null表示输入结束):

  1. 创建一个全新的,新的&#34; WPF应用程序&#34;项目
  2. 将其添加到MainWindow.xaml.cs中的MainWindow构造函数中:

    if (Console.In.Peek() != -1) // If there's input on the standard input stream.
    {
        var fullInput = new StringBuilder();
        var currentLine = string.Empty;
        while ((currentLine = Console.ReadLine()) != null)
            fullInput.AppendLine(currentLine);
    
        MessageBox.Show($"Input: {fullInput}");
    }
    else
        MessageBox.Show("No input detected on stdin");
    
  3. 使用和不使用命令行输入字符串来运行和运行。

    • 没有输入:

      c:\> WpfApplication1.exe
      

      enter image description here

    • 输入:

      c:\> echo "testing 1, 2, 3" | WpfApplication1.exe
      

      enter image description here