Как читать со стандартного ввода в приложении WPF? - PullRequest
2 голосов
/ 17 марта 2009

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

Console.ReadLine()

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

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

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

Ответы [ 3 ]

3 голосов
/ 17 марта 2009

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

0 голосов
/ 30 сентября 2016

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

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

  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

0 голосов
/ 17 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...