2012-04-05 2 views
1

Ich habe viele Beispiele für eine Hybrid-GUI/CLI-App für C# gesehen. Ich habe eine solche App implementiert, aber es fällt mir schwer herauszufinden, wie verhindert werden kann, dass die .exe, wenn sie in der Befehlszeile ausgeführt wird, nicht sofort zur Eingabeaufforderung zurückkehrt.C# hybird Winforms/Konsole App zurück zu cmd Eingabeaufforderung

//defines for commandline output  
    [DllImport("kernel32.dll")] 
    static extern bool AttachConsole(int dwProcessId); 
    private const int ATTACH_PARENT_PROCESS = -1; 

    [STAThreadAttribute] 
    static void Main(string[] args) 
    { 
     // load cli 
     // redirect console output to parent process;   
     // must be before any calls to Console.WriteLine()   
     AttachConsole(ATTACH_PARENT_PROCESS); 

     if (args.Length == 0) 
     { 
      //loads gui 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new form_Main()); 
     } 
     else 
     { 

      cli_main cli = new cli_main(); 
      cli.start_cli(args); 

      Console.WriteLine("finished"); 

      System.Windows.Forms.SendKeys.SendWait("{ENTER}"); 
      Application.Exit(); 

     } 
    } 

ich die folgende Ausgabe

C:\Users\john\Documents\Visual Studio 2010\Projects\test\test\test\bin\Debug>test.exe -param1 test 
-param2 test2 

C:\Users\john\Documents\Visual Studio 2010\Projects\test\test\test\bin\Debug>Output was successful. File saved as: c:\test\test.html 
finished 

Die Linie „fertig“ erhalten, ist eine Saite, die ich ausgegeben, wenn ich weiß, dass ich Reichweite Ende meiner Haupt-Code ... das funktioniert in WinForms in Ordnung, meine Projekt ist Winforms und ich begann es als GUI, aber jetzt versuche ich es hybrid gui/cli

Und es scheint zu laufen mein Hauptcode und Threads sehe ich sie im Debuggen und es erstellt meine endgültige Ausgabedatei. ..

Ich bin nur verwirrt, wie die EXE behalten, wenn sie von cmd Zeile mit seinen Parametern ausgeführt wird, um nicht zur Eingabeaufforderung zurückzukehren ?? Und warten Sie mit einem blinkenden Cursor, geben Sie dann die Zeile über die HTML-Datei aus und dann die Zeile "fertig", dann gehen Sie zurück zur Eingabeaufforderung.

ich zahlreiche Dinge wie das Entfernen

System.Windows.Forms.SendKeys.SendWait("{ENTER}"); 
Application.Exit(); 

und statt mit Application.Exit(); Verwendung Environment.Exit(0); aber es gibt immer an die Eingabeaufforderung sofort versucht, auch versucht habe ich für 5 Sekunden nach der Zeile im Schlaf setzen

cli.start_cli(args); 

aber das hat nicht funktioniert, ich glaube, ich verstehe nicht, wie es prompt sofort Befehl zurückgeben kann, und es hat sie nicht einmal die Linie

Console.WriteLine("finished"); 
+0

Ich habe nur aufgegeben, zu versuchen, eine hybride CLI und GUI .exe, wenn ich Projekt als Winform halten, bekomme ich dieses Problem oben, wenn ich es als Konsole App behalten , dann würde ich ein cmd-Fenster öffnen, für das ich einen Workaround bekommen habe, aber es würde immer noch für Sekunden auftauchen. also ging ich einfach mit 2 .exe, 1 für gui 1 für cli und dann erstellt eine .dll lib um den hauptcode zwischen den 2 zu teilen. –

Antwort

6

FWIW, habe ich den ersten Ansatz auch versucht. Ich versteckte das Konsolenfenster nur mit:

IntPtr handle = GetConsoleWindow(); 
if (handle != IntPtr.Zero) 
{ 
    ShowWindow(handle, 0); // 0=SW_HIDE 
} 

Dies verbirgt das Fenster vollständig, auch von der Taskleiste. Es blinkt für eine kurze Sekunde, aber das ist in meinem Fall akzeptabel

Verwandte Themen