von windows form eine console starten c#?

3 Antworten

Irgendwie verstehe ich nicht was Du meinst?

Was hat der Projektordner mit einem aufgerufenen Konsonenprogramm zu tun? Wenn eine aufgerufenen App nicht dort liegt, ruft man sie eben mit dem vollen Pfad auf

using System;
using System.Diagnostics;
using System.Drawing;
using  System.Windows.Forms;

class Form1  : Form{
    private Button Button1;

    public Form1(){
        this.Text = "Eine Esel App";
        ClientSize = new Size(320, 240);

        Button1 = new Button();
        Button1.Text = "start WindowsConsole";
        Button1.Location = new Point(10, 40);
        Button1.AutoSize = true;
        Button1.Click += new System.EventHandler(Button1_Click);
        Controls.Add(Button1);
    }

    private void Button1_Click(object sender, EventArgs e){
          //starte Cmd mitein par parametern
        Process.Start("C:\Windows\System32\cmd.exe", "/k echo Hallo");
    }

    public static void Main(string[] args){
        Application.EnableVisualStyles();
            Application.Run(new Form1());
    }
}
...schlecht erklärt habe aber ich meine das es von der form zur console geht.

was soll vom Form zur Console gehen?

Eine Windowsforms App hat normal keine Console, wo irgendwas "hingehen" könnte .

Es sei denn man compiliert ein normales Consolenprogramm und und kümmert sich selbst um das Handling von Form und Console. Achtung!!! Das folgende nicht als Formsapp compilieren!!! Würde abstürzen, weil es kein HWnd auf die Console gibt.

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
  //needed Guipart
using System.Drawing;
using  System.Windows.Forms;


class Form1  : Form{
    private static IntPtr ConHandle;
    private static bool ConHidden = false;
    [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);


    private Button Button1;
    private Label Display1;
    
      //declaration GUIpart
    public Form1(){
        this.Text = "Eine Esel App";
        ClientSize = new Size(320, 240);
        
        Display1 = new Label(){Text="Console on"};
        Display1.Location = new Point(10, 0);
        Display1.AutoSize = true;
        Controls.Add(Display1);


        Button1 = new Button();
        Button1.Text = "Toggle Console";
        Button1.Location = new Point(10, 40);
        Button1.AutoSize = true;
        Button1.Click += new System.EventHandler(Button1_Click);
        Controls.Add(Button1);
    }


    private void Button1_Click(object sender, EventArgs e){ 
            if (ConHidden){
                ConHidden = ShowWindow(ConHandle, 1);
                Display1.Text = "Console on";
                Console.WriteLine("Console on");
            }
            else{
                ConHidden = ShowWindow(ConHandle, 0);
                Display1.Text = "Console off";
                Console.WriteLine("Console off");
            }
    }


    public static void Main(string[] args){
         //run GUIpart as parallel Task and wait for closing the GUIpart!
        var GUITask = Task.Run( () => {
            Application.Run(new Form1());
        });
         //do something at Console
        Console.WriteLine("Hallo ich bin die Console");
        ConHandle = Process.GetCurrentProcess().MainWindowHandle;
        if ((ulong)ConHandle > 0) {
            Console.Title = "Eine Esel App - Console";
            Console.WriteLine("hwnd of this Console : \"{0} \" = {1}",Console.Title,ConHandle);
        }
        else {
            Console.WriteLine("hwnd of this Console : \"{0} \" = {1}",Console.Title,ConHandle);
            Console.WriteLine("this is not my own console window, i am not allowed to minimize it");
        };
          //run GUIpart as parallel Task and wait for closing the GUIpart!
        GUITask.Wait();
    }
}

Palladin007  08.04.2022, 16:25
Achtung!!! Das folgende nicht als Formsapp compilieren!!! Würde abstürzen, weil es kein HWnd auf die Console gibt.

Gibt's schon, wenn Du eine Konsole allokierst ;)

Aber ich frage mich auch, was eigentlich soll, wenn es im selben Prozess laufen soll, ist es doch immer besser, das direkt in die View zu integrieren?

0
Erzesel  08.04.2022, 17:23
@Palladin007

Ich hatte mich auch nicht in die Tiefe mit der Problematik beschäftigt.

Eine ähnliche Technik (wie ichs gemacht habe) hatten wir bei SpielekonsolenEmus werwendet um Statusinformationen aus dem Core des Emus auszugeben. Die Gui ist defakto nur "drangetackert" Der Consolteil benötigt die GUI nicht.

Schön ist sowas ohnehin nicht... und geht total am Konzept einer Formsanwendung vorbei.

Ich hab mir mal die neuste Frage des FS angesehen und denke, das er irgendwie konzeptionell total auf dem Holzweg ist.

0
Palladin007  08.04.2022, 18:31
@Erzesel

Stimmt, als Konsolen-App geht's natürlich auch, hinter einem WinForms-Projekt steckt ja nicht so viel Magie, außer ein paar Zeilen generierter Code. Was nun besser ist ... keine Ahnung :D Vermutlich deine Variante, weil man die WinAPI nicht braucht.

Ich halte es einfach für generell unhandlich - auch für den Nutzer - eine Konsole zu benutzen. Es ist doch viel einfacher, den Text in eine Liste zu schreiben und die anzuzeigen. Dann hat man als Entwickler auch gleich viel mehr Möglichkeiten, bei einer Konsole wird das schnell zu einer Mammutsaufgabe.

das er irgendwie konzeptionell total auf dem Holzweg ist.

Vermutlich - Ist aber oft so.

Wobei die Frage, die Du verlinkt hast, ziemlich oft kommt, vermutlich jeder Anfänger fragt das oder such wenigstens selber danach. Danach probiert jeder Anfänger Thread.Sleep aus und fragt anschließend, warum die UI nicht mehr reagiert :D

Frameworks wie WPF und WinForms (das ist sowieso Mist) sind einfach nicht für Anfänger geeignet, waren sie nie. Aber in so vielen Tutorials wird behauptet, es sei so super einfach, während sie nur die langweiligen Standard-Sachen zeigen und die 99% Rest, der dann plötzlich schwieriger wird, einfach weg lassen und am besten noch "Es ist also ganz einfach" dazu sagen :/

1
Palladin007  08.04.2022, 18:47
@Palladin007

Ich hab gerade gesehen, dass da wieder "async void" empfohlen wurde - das tut ja noch mehr weh, als die Frage ...

1

Selber Prozess?
Das geht mit der AllocConsole-Funktion der Win32-API.

Anderer Prozess?
Starte einfach einen neuen Prozess mit einem Konsolen-Programm.

alles innerhalb der Projekt Mappe

Die Projektmappe hat keinerlei Bedeutung, die ist im Grunde nur eine Liste von Projekten und ein paar Konfigurationen, das wars.

Wenn Du ein anderes Konsolen-Projekt starten willst, referenziere das Projekt, dann wird es mit kopiert und Du kannst die exe starten.

Oder lass einfach den Quatsch und ruf den Kram aus der Konsolen-Anwendung direkt auf.

Process.Start(„Name der Exe“)


Julien4 
Fragesteller
 07.04.2022, 18:39

nene des war nicht das was gemeint habe, okay liegt verscheinlich daran das ich es schlecht erklärt habe aber ich meine das es von der form zur console geht.

0