2010-06-16 8 views
11

Hola, sé cómo escribir en la consola, pero si escribo en la consola en mi programa y llamo a mi programa desde la línea de comandos, no se mostrará nada.¿Cómo escribo en la línea de comando desde una aplicación WPF?

¿Cómo lo hago para que cuando digo Console.WriteLine o Console.Out.Writeline ir imprima en el símbolo del sistema desde el que se llamó y no en otro lugar?

Una vez más, sé cómo hacer Console.WriteLine, así que no es eso :-p a menos que lo esté haciendo mal.

De lo que puedo decir que es probablemente algo que ver con Console.SetOut (TextWriter t)

se trata de una aplicación de WPF y lo necesito para publicar sus datos a la línea de comandos al tiempo que conserva la interfaz gráfica de usuario en el arranque . He comprobado tres veces y mi código llega a las líneas de impresión, realmente puedo ver las líneas que se imprimen en la ventana de salida de Visual Studio, simplemente no se muestra en la línea de comandos cuando lo ejecuto manualmente sin VS.

Si es posible, necesito tener la pantalla de la consola de forma condicional. es decir, si se ejecuta desde la línea de comandos (o incluso con argumentos de comando), se muestra o publica en el mensaje, de lo contrario no se muestra.

+1

¿Se puede añadir algo de código más, por favor? –

+0

Eso debería funcionar, necesita más información/código –

+0

bien. Quiero imprimir una cadena con información de ayuda para la línea de comando, que se encuentra en mi cadena "helpString". Console.WriteLine (helpString); esto no dará salida a la cadena al símbolo del sistema si lo abro, navego a mi ejecutable y lo ejecuto. Hasta donde sé, debe estar imprimiendo la salida en otro lugar. Así que traté de usar el método SetOut de la clase Console pero no sé dónde obtener un StreamWriter que se aplicaría al símbolo del sistema. realmente no hay más código que eso. Este es un proyecto de WPF en caso de que eso ayude. – ben

Respuesta

0

Establezca el tipo de proyecto en "Aplicación de consola" en lugar de "Aplicación de Windows" . Esto causará que la Aplicación se conecte a la consola desde la cual se lanzó (o cree una consola si ya no existía).

+3

¿Hay alguna manera de hacerlo condicionalmente? al igual que si el proceso se ejecutó desde la línea de comandos, se conecta a la línea de comandos, pero de lo contrario no? – ben

+0

Ben, nunca había oído hablar de tal cosa, pero sería un truco genial. Supongo que es posible que puedas detectar el proceso principal, que sería la ventana de la consola. –

+1

@ben: No hay una manera fácil, sin embargo, el enfoque de Jonathan probablemente funcionaría. Debería llamar a AttachConsole con el ID de proceso de la consola de llamada. Ver: http://msdn.microsoft.com/en-us/library/ms681952(VS.85).aspx –

0

Eso debería funcionar bien, doble y triple comprueba lo que has hecho y si es posible publica tu código. Puede ver las propiedades del proyecto y verificar que el tipo de salida sea 'Aplicación de consola' (creo que se llama así de todos modos: oP)

+0

esta es una aplicación WPF y necesito que publique sus datos en la línea de comando mientras aún conserva la GUI al inicio. He comprobado tres veces y mi código llega a las líneas de impresión, realmente puedo ver las líneas impresas en la ventana de salida de Visual Studio, simplemente no se mostrará en la línea de comandos cuando lo ejecute manualmente sin VS. – ben

+0

ben todos estos comentarios contienen información pertinente a la pregunta, por favor podría agregar esta información a la pregunta. Gracias. –

+0

He actualizado la pregunta para reflejar la información adicional. Lo siento por eso. – ben

29

Esto es realmente trivial:

public void WriteToConsole(string message) 
{ 
    AttachConsole(-1); 
    Console.WriteLine(message); 
} 
[DllImport("Kernel32.dll")] 
public static extern bool AttachConsole(int processId); 

Este método escribirá su mensaje a la consola si el programa se inicia desde la línea de comandos, de lo contrario, no hará nada.

Si desea utilizar un mecanismo de salida alternativa cuando no se iniciaron desde la línea de comandos que puede hacerlo de esta manera:

public void WriteToConsole(string message) 
{ 
    _connected = _connected || AttachConsole(-1); 
    if(_connected) 
    Console.WriteLine("Hello"); 
    else 
    ... other way to output message ... 
} 
bool _connected; 
[DllImport("Kernel32.dll")] 
public static extern bool AttachConsole(int processId); 
+2

Niza. Tuve un pequeño problema por el cual la ventana de la consola (¿sesión?) No sale cuando se ejecuta desde la línea de comandos. Al agregar esto, se encargó de eso: "SendKeys.SendWait (" {ENTER} ");". También agregué una llamada a FreeConsole(). –

+0

Impresionante. Gracias. – Dennis

+1

Esto es genial, pero ¿cómo lo obtienes para que vuelva el prompt de la línea de comando? lo que recibo es el mensaje, luego la consola comienza a escribirse, por lo que el usuario final no se queda con el indicador c: \>. –

Cuestiones relacionadas