2

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

Console.ReadLine()

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

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

编辑:尽管 Daniel Pratt 解决了我最初的问题,但弄清楚如何从标准输入中读取仍然会很好。如果您可以回答,我将更改已接受的答案。

4

3 回答 3

3

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

于 2009-03-17T19:53:31.607 回答
1

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

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

  1. 创建一个全新的“WPF 应用程序”项目。
  2. 将此添加到MainWindowMainWindow.xaml.cs 中的构造函数:

    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
      

      在此处输入图像描述

    • 有输入:

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

      在此处输入图像描述

于 2016-09-30T20:17:10.877 回答
0

查看用于从 stdin/stdout 流读取/写入的 .NET 框架代码,看起来好像实际上没有任何依赖于控制台窗口。该代码似乎只是利用各种本机 Win32 调用,首先是 GetStdHandle 以获取标准输入/输出流的句柄,然后创建一个__ConsoleStream类,该类是 Win32 ReadFileNativeWriteFileNative函数的托管包装器。所以真的,我看不出有任何不应该工作的理由......当您将代码直接放在MainConsole.ReadLine中时,值得检查使用控制台从标准输入读取的调用是否成功功能。我想这里的问题可能与 Windows 识别的应用程序类型有关,但我不明白为什么非控制台应用程序应该被限制从标准输入/写入到标准输出。另一个可能的原因可能是您从中进行调用的线程。不管怎样,去测试一下,让我知道结果。如果你仍然没有任何成功,我会尝试做一些我自己的测试,因为我对解决方案很好奇。

于 2009-03-17T20:35:03.117 回答