Domanda

Sto cercando di capire come leggere dal flusso di input standard della mia applicazione WPF ma non riesco a trovare un modo per ottenere il flusso. Il modo standard per farlo,

Console.ReadLine()

restituisce immediatamente Null (Nothing). Presumo perché non è un'applicazione console e nessuna finestra della console è aperta. Come posso leggere dallo standard input in un'applicazione WPF?

Alcuni backgroud: sto cercando di leggere il testo inviato da un dispositivo esterno (lettore di carte magnetiche) che invia i suoi dati allo stdin dell'applicazione attualmente focalizzata. Posso concentrarmi su un TextBox e quindi leggere i dati da lì, se devo, ma preferirei piuttosto leggere i dati direttamente, se possibile, per evitare una serie di possibili problemi.

Modifica : anche se Daniel Pratt ha risolto il mio problema originale, sarebbe comunque bello capire come leggere da stdin. Se riesci a rispondere, cambierò la risposta accettata.

È stato utile?

Soluzione

Avevo l'impressione che i dispositivi di questo tipo di solito funzionino come una tastiera (questo avrebbe senso la parte sulla TextBox dalla domanda originale). Penso che devi solo agganciare alcuni eventi della tastiera.

Altri suggerimenti

Console.ReadLine () funziona nelle app WPF, almeno quando provo eseguendo il piping dalla riga di comando. Forse null è stato esplicitamente inviato dal driver del lettore di schede (potrebbe significare qualcosa).

Per le persone come me che sono venute alla ricerca di un how-to generale, ecco una demo di ciò che ho fatto (presuppone che null significhi fine dell'input):

  1. Crea una nuova, nuova applicazione "WPF" progetto.
  2. Aggiungilo al costruttore di MainWindow in 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. Crea ed esegui con e senza reindirizzare una stringa dalla riga di comando.

    • Senza input:

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

       inserisci qui la descrizione dell'immagine

    • Con input:

      <*>

       inserisci qui la descrizione dell'immagine

Guardando il codice .NET framework per leggere / scrivere dai flussi stdin / stdout, sembra che non ci sia nulla di dipendente dalla finestra della console. Il codice sembra semplicemente fare uso di varie chiamate Win32 native, in primo luogo a GetStdHandle per ottenere l'handle del flusso in / out standard e crea una classe __ConsoleStream che è un wrapper managedd su Win32 < em> ReadFileNative e WriteFileNative . Quindi, davvero, non vedo alcun motivo per cui Console.ReadLine non dovrebbe funzionare ... Vale la pena controllare se le chiamate da leggere da stdin utilizzando Console hanno successo quando si inserisce il codice direttamente nella funzione Principale . Suppongo che il problema qui possa avere a che fare con il tipo di applicazione riconosciuto da Windows, ma non vedo perché le app non console debbano essere limitate dalla lettura da stdin / scrittura a stdout. L'altra possibile causa potrebbe essere il thread da cui si stanno effettuando le chiamate. In ogni caso, provalo e fammi sapere i risultati. Se non hai ancora avuto successo, proverò a fare alcuni dei miei test poiché sono curioso di sapere la soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top