.NET.FORM & .NET.CONSOLE in einer Anwendung

andralin

Erfahrenes Mitglied
Hallo Leute,

zuerst mal weis ich nicht genau ob ich in diesem Thema richtig liege.

Problemstellung:
Eine Anwendung soll beim Start mit und ohne Parameter gestartet werden können.
Ein Parameter wäre /console.

Nun möchte ich bei einem Start der Anwendung ohne Parameter mit einem FORM starten, bei START mit Parametern komplett ohne Ausgabe und beim Start mit der Option /console möchte ich ein Konsolenfenster erzeugen, welches dann mit console.writeline, etc ausgaben bekommt.

Nach mehreren versuchen komme ich nicht weiter. Alle drei Modi müssen möglich sein, also FORM, CONSOLE und ohne Anzeige das ein Programm gestartet wurde.

Die Entscheidung fällt direkt beim Start der Anwendung, der folgende Code ist nur ein theoretisches Koknstrukt, .... Geht so nicht. Das ist klar.
Code:
static void Main()
{
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       if (ParameterUebergabe == false)
       {
              Application.Run(new MyFromy());
       }
       else
       {
              if (ConsoleIsGiven == true)
              {
                     Application.Run(new MyConsoley());
              }
              else
              {
                     Application.Run(new Silenty());
              }
       }
}
Wer kann mir einen tip geben wie ich hier mit einem Projekt auskomme?!!

LG Andralin
 
Hallo Andralin,

die Entscheidung, ob Konsole oder Fenster, wird in den Projekteingeschaften getroffen. Zur Laufzeit kannst du da nichts mehr ausrichten.
Die Frage ist, ob du ein richtiges Konsolenfenster benötigst oder eigentlich nur eine konsolenähnliche Darstellung für Textausgaben. Dann würde eine Windowsapplikation reichen, die man recht einfach mit den 3 Modi ausstatten kann.
Falls du Wert auf die "echte" Konsole legst, fällt mir dazu nur ein, über eine Art Applicationlauncher (fensterlose Windows-App) entweder ein Konsolenprogramm oder eine Fensteranwendung (für FORM und SILENT) zu starten.

Gruß
MCoder
 
Hallo Andralin,

die Entscheidung, ob Konsole oder Fenster, wird in den Projekteingeschaften getroffen. Zur Laufzeit kannst du da nichts mehr ausrichten.
Die Frage ist, ob du ein richtiges Konsolenfenster benötigst oder eigentlich nur eine konsolenähnliche Darstellung für Textausgaben. Dann würde eine Windowsapplikation reichen, die man recht einfach mit den 3 Modi ausstatten kann.
Falls du Wert auf die "echte" Konsole legst, fällt mir dazu nur ein, über eine Art Applicationlauncher (fensterlose Windows-App) entweder ein Konsolenprogramm oder eine Fensteranwendung (für FORM und SILENT) zu starten.

Gruß
MCoder

Das Problem ist noch ein wenig komplexer...
a) Programm wird mit Doppel-Klick gestartet, dann will ich ein Windows Form
b) Programm wird über RUN(START/AUSFÜHREN) mit Optoinen gestartet, dann will ich kein Form und nur ein Consolenfenster wenn eine der Optionen /console lautet
c) ich starte aus einer Batchdatei, dann will mit der Konsole die das batch aufbaut weiter arbeiten.
 
Problem gelöst!

Code:
namespace MyNameSpace
{
    static class Program
    {   
        static MyFunctionality func = new MyFunctionality
        
        [STAThread]

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool AllocConsole();

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool FreeConsole();

        [DllImport("kernel32", SetLastError = true)]
        static extern bool AttachConsole(int dwProcessId);

        [DllImport("user32.dll")]
        static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);   

        static void Main(string[] dlvr_ProgParams)
        {
            if (dlvr_ProgParams.Length < 1)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frmComosUpdateCenter4());
            }
            else
            {
                func.GetParameters(dlvr_ProgParams);
                if (globComosUpdCentFunktions.globShowConsole == true)
                {
                    IntPtr ptr = GetForegroundWindow();
                    int u;
                    GetWindowThreadProcessId(ptr, out u);
                    Process process = Process.GetProcessById(u);

                    if (process.ProcessName == "cmd")    //Is the uppermost window a cmd process?   
                    {
                        //***   Anwendung wird mit dem Parameter /console über eine Batchdatei 
                        //***   oder aus CMD-Fenster aufgerufen und das CMD Fenster wird für weitere 
                        //***   Ausgaben benutzt
                        AttachConsole(process.Id);                        
                        func.RunSilentMode();  //*** hier die Abarbeitung der Optionen für den Silent Mode, ohne FORMS!                      
                    }
                    else
                    {
                        //***   Anwendung wird mit RUN(START/AUSFÜHREN) und der Option /console aufgerufen und 
                        //***   ein neues CMD Fenster wird erzeugt und für weitere Ausgeben benutzt
                        AllocConsole();                        
                        func.RunSilentMode();  //*** hier die Abarbeitung der Optionen für den Silent Mode, ohne FORMS!         
                    }

                    FreeConsole();
                }
                else
                {//*** keine Konsolen-Ausgabe erwünscht, totaler Silent Mode!
                    func.RunSilentMode();  //*** hier die Abarbeitung der Optionen für den Silent Mode, ohne FORMS!         
                }
            }
        }
    }
}
 

Neue Beiträge

Zurück