代码之家  ›  专栏  ›  技术社区  ›  Bryan Anderson

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

  •  2
  • Bryan Anderson  · 技术社区  · 15 年前

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

    Console.ReadLine()
    

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

    一些背景:我正在尝试读取由外部设备(磁卡读卡器)发送的文本,它将数据发送到当前焦点应用程序的stdin。我可以将焦点设置在一个文本框上,然后在必要时从中读取数据,但如果可能的话,我更愿意直接读取数据,以避免出现大量可能的问题。

    编辑 :即使丹尼尔·普拉特解决了我最初的问题,但想办法从stdin中读取数据还是很好的。如果你能回答的话,我会更改已接受的答案。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Daniel Pratt    15 年前

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

        2
  •  0
  •   Noldorin    15 年前

    查看用于从stdin/stdout流读取/写入的.NET框架代码时,实际上似乎没有任何依赖于控制台窗口的内容。代码似乎只是简单地使用各种本机win32调用,首先是getstddhandle以获取标准入/出流的句柄,然后创建一个 第二乐章 类,它是Win32上的ManagedD包装器 读写的 书面文件的 功能。所以说真的,我不知道为什么 Console.ReadLine 不应该工作…值得检查是否使用 慰问 当您将代码直接放入 主要的 功能。我想这里的问题可能与Windows识别的应用程序类型有关,但是我不明白为什么非控制台应用程序应该限制从stdin读取/写入stdout。另一个可能的原因可能是从中进行调用的线程。不管怎样,去测试一下,让我知道结果。如果你仍然没有任何成功,我会尝试做一些我自己的测试,因为我对解决方案很好奇。

        3
  •  0
  •   Vimes L.B    8 年前

    Console.ReadLine() 在WPF应用程序中工作,至少当我尝试通过命令行进行管道连接时。可能读卡器的驱动程序正在显式地发送空值(可能表示某些内容)。

    对于像我这样寻求一般操作方法的人,下面是我所做的演示(假设为空表示输入结束):

    1. 创建一个新的“WPF应用程序”项目。
    2. 将此添加到 MainWindow 在mainwindow.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
        

        enter image description here

      • 输入:

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

        enter image description here