2009-03-17 6 views
2

Я пытаюсь понять, как читать из стандартного потока ввода моего собственного приложения WPF, но я не могу найти способ получить поток. Стандартный способ сделать это,Как читать со стандартного ввода в приложении WPF?

Console.ReadLine() 

возвращает Null (Nothing) немедленно. Я предполагаю, что это не консольное приложение, и окно консоли не открыто. Как я могу читать со стандартного ввода в приложении WPF?

Немного backgroud: Я пытаюсь прочитать текст, отправленный внешним устройством (устройством для чтения магнитных карт), которое отправляет свои данные в stdin текущего сфокусированного приложения. Я могу сосредоточиться на TextBox, а затем читать данные оттуда, если это необходимо, но я бы скорее прочитал данные напрямую, если это возможно, чтобы избежать множества возможных проблем.

Редактировать: Несмотря на то, что Даниэль Пратт решил мою первоначальную проблему, все равно было бы неплохо выяснить, как читать с stdin. Если вы можете ответить, я изменю принятый ответ.

ответ

3

У меня создалось впечатление, что устройства такого типа обычно функционируют как клавиатура (это сделало бы смысл в TextBox из оригинального вопроса). Я думаю, вам просто нужно подключить некоторые события клавиатуры.

0

Ознакомившись с кодом платформы .NET для чтения/записи из потоков stdin/stdout, кажется, что на самом деле ничего не зависит от окна консоли. Этот код, по-видимому, просто использует различные собственные вызовы Win32, во-первых, в GetStdHandle, чтобы получить дескриптор стандартного потока ввода/вывода, и создает класс __ConsoleStream, который является оберткой с управляемым интерфейсом по Win32. ReadFileNative и WriteFileNative функции. Так что действительно, я не вижу причин, почему Console.ReadLine не должен работать ... Стоит проверить, действительно ли вызовы для чтения из stdin с помощью Консоль преуспеть, если вы поместите код непосредственно в функцию Main. Я предполагаю, что проблема здесь может быть связана с типом приложения, как это было распознано Windows, но я не понимаю, почему неконсольные приложения должны быть ограничены чтением из stdin/write в stdout. Другой возможной причиной может быть поток, с которого вы звоните. В любом случае, попробуйте проверить это и дайте мне знать результаты. Если у вас все еще не будет успеха, я постараюсь сделать некоторые из моих собственных тестов, поскольку мне любопытно, как это сделать.

0

Console.ReadLine() работает в приложениях WPF, по крайней мере, когда я пытаюсь выполнить трубопровод через командную строку. Возможно, null был явно отправлен драйвером устройства чтения карт (может означать что-то).

Для людей вроде меня, которые пришли в поисках генерала, как-то, вот демо, что я сделал (предполагается, что нуль означает конец ввода):

  1. Создать свежий, новый проект «WPF Application» ,
  2. Добавьте к этому конструктору MainWindow «s в 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

+0

Первоначальный вопрос заключался в чтении с консоли во время выполнения, а не при поиске аргументов при запуске. Приятно знать, что вы все равно можете получить аргументы при запуске! –

+0

Правильно. Но это именно так. Ввод строки в командной строке не содержит аргументов. Это удобный способ отправки текста в 'stdin', который можно прочитать в любое время во время выполнения, вызывая' Console.ReadLine() '. – Vimes

Смежные вопросы