Incorporare una console DOS in un modulo di Windows

È ansible incorporare una console DOS in Windows Form o User Control in C # 2.0?

Abbiamo un prodotto DOS legacy con cui l’app Windows deve interagire, ed è stato richiesto che un’istanza del prodotto legacy debba essere eseguita all’interno dell’applicazione Windows.

Al momento, sto usando il file user32.dll per localizzare la finestra in cui è in esecuzione il prodotto DOS, riducendo al minimo la massimizzazione della finestra e digitando i caratteri nella finestra. Questa non è una buona soluzione al problema, poiché significa che la mia applicazione deve memorizzare il nome della finestra nelle impostazioni dell’applicazione e richiede che l’utente ritorni alla pagina corretta dell’app DOS prima di utilizzare la funzione di interazione.

EDIT: alcune ulteriori informazioni

L’app legacy deve essere visibile all’utente, ma non in una finestra separata.

Ho provato la risposta di TimothyP e funziona molto bene, ma è ansible ottenere la stessa funzionalità, ma con la finestra DOS visivamente incorporata in un modulo di Windows o controllo utente invece di apparire nella sua finestra? Preferibilmente in un modo ShowDialog () in modo che l’utente non possa interagire con l’app wile sono in “modalità legacy”, per così dire.

È ansible redirect lo standard input / output delle applicazioni console / dos utilizzando la class Process. Potrebbe sembrare qualcosa del genere:

var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters"); processStartInfo.UseShellExecute = false; processStartInfo.ErrorDialog = false; processStartInfo.RedirectStandardError = true; processStartInfo.RedirectStandardInput = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.CreateNoWindow = true; Process process = new Process(); process.StartInfo = processStartInfo; bool processStarted = process.Start(); StreamWriter inputWriter = process.StandardInput; StreamReader outputReader = process.StandardOutput; StreamReader errorReader = process.StandardError; process.WaitForExit(); 

Ora puoi utilizzare gli stream per interagire con l’applicazione. Impostando processStartInfo.CreateNoWindow su true, l’applicazione originale verrà nascosta.

Spero che aiuti.

Per quanto riguarda la tua domanda su come visualizzare l’app DOS all’interno dell’app di Windows.

Ci sono alcune soluzioni.

  • Il primo è semplicemente non visualizzare l’app DOS (con CreateNoWindow) e “simulare” l’interfaccia utente dell’app DOS nell’applicazione Windows leggendo e scrivendo negli stream.

  • L’altra soluzione sarebbe quella di utilizzare Win32API, ottenere l’handle di Windows (Whnd) della finestra dell’applicazione Console / DOS e impostare il genitore sul form. Al momento non sono a casa e da quando ho fatto questo, non riesco a ricordare a memoria come è fatto. Se non sbaglio dovrai utilizzare le seguenti chiamate API Win32:

    • FindWindow
    • GetWindow
    • SetParent

Se avrò un po ‘di tempo oggi, vedrò se riesco a trovare campioni migliori.

È ansible utilizzare la funzione CreateProcess ei membri hStdInput, Output e Error dell’argomento STARTUPINFO, ciò consentirà di intercettare gli input e output standard dell’applicazione.