Pregunta

Estoy tratando de descubrir cómo leer el flujo de entrada estándar de mi propia aplicación WPF, pero no puedo encontrar una manera de obtener el flujo. La forma estándar de hacerlo,

Console.ReadLine()

devuelve Nulo (Nada) inmediatamente. Asumo porque no es una aplicación de consola y no hay ninguna ventana de consola abierta. ¿Cómo puedo leer desde la entrada estándar en una aplicación WPF?

Algún fondo: estoy tratando de leer el texto enviado por un dispositivo externo (lector de tarjetas magnéticas) que envía sus datos a stdin de la aplicación actualmente enfocada. Puedo establecer el foco en un cuadro de texto y luego leer los datos desde allí si es necesario, pero preferiría leer los datos directamente si es posible para evitar una gran cantidad de posibles problemas.

Editar : a pesar de que Daniel Pratt resolvió mi problema original, sería bueno descubrir cómo leer de stdin. Si puede responder, cambiaré la respuesta aceptada.

¿Fue útil?

Solución

Tenía la impresión de que los dispositivos de este tipo generalmente funcionan como un teclado (esto tendría sentido sobre la parte del TextBox de la pregunta original). Creo que solo necesitas conectar algunos eventos de teclado.

Otros consejos

Console.ReadLine () funciona en aplicaciones WPF, al menos cuando lo intento canalizando a través de la línea de comandos. Quizás null fue enviado explícitamente por el controlador del lector de tarjetas (podría significar algo).

Para personas como yo que vinieron en busca de un tutorial general, aquí hay una demostración de lo que hice (se supone que nulo significa el final de la entrada):

  1. Crear una nueva y nueva "Aplicación WPF" proyecto.
  2. Agregue esto al constructor de MainWindow en 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(
    c:\> WpfApplication1.exe
    
    quot;Input: {fullInput}"); } else MessageBox.Show("No input detected on stdin");
  3. Construye y ejecuta con y sin canalizar una cadena desde la línea de comando.

    • Sin entrada:

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

       ingrese la descripción de la imagen aquí

    • Con entrada:

      <*>

       ingrese la descripción de la imagen aquí

Al mirar el código del marco .NET para leer / escribir desde las secuencias stdin / stdout, parece que, de hecho, no hay nada que dependa de la ventana de la consola. El código parece simplemente utilizar varias llamadas nativas de Win32, en primer lugar a GetStdHandle para obtener el identificador de la secuencia de entrada / salida estándar, y crea una clase __ConsoleStream que es un contenedor administrado sobre Win32 < em> ReadFileNative y WriteFileNative funciones. Entonces, realmente, no veo ninguna razón por la cual Console.ReadLine no debería funcionar ... Vale la pena verificar si las llamadas para leer desde stdin usando Console tienen éxito cuando coloca el código directamente en la función Principal . Supongo que el problema aquí podría tener algo que ver con el tipo de aplicación reconocido por Windows, pero no veo por qué las aplicaciones que no son de consola deberían restringirse de la lectura de stdin / escritura a stdout. La otra posible causa podría ser el hilo desde el que está realizando las llamadas. De todos modos, intenta probar esto y déjame saber los resultados. Si aún no tiene éxito, intentaré hacer algunas de mis propias pruebas ya que tengo curiosidad sobre la solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top