webentwicklung-frage-antwort-db.com.de

wie man ein Winform von der Konsolenanwendung aus ausführt?

Wie kann ich eine Winform in einer Konsolenanwendung erstellen, ausführen und steuern?

61
reshefm

Die einfachste Möglichkeit ist, ein Windows Forms-Projekt zu starten und dann den Ausgabetyp in Konsolenanwendung zu ändern. Alternativ können Sie einfach einen Verweis auf System.Windows.Forms.dll hinzufügen und die Codierung starten:

using System.Windows.Forms;

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.Run(new Form()); // or whatever
}

Das wichtige Bit ist der [STAThread] in Ihrer Main()-Methode, der für die vollständige COM-Unterstützung erforderlich ist.

87
Marc Gravell

Ich wollte dies kürzlich tun und stellte fest, dass ich mit den Antworten hier nicht zufrieden war.

Wenn Sie den Empfehlungen von Marc folgen und den Ausgabetyp auf Konsolenanwendung setzen, gibt es zwei Probleme:

1) Wenn Sie die Anwendung über den Explorer starten, erhalten Sie hinter Ihrem Formular ein nerviges Konsolenfenster, das erst nach Beenden des Programms verschwindet. Wir können dieses Problem verringern, indem Sie FreeConsole aufrufen, bevor Sie die GUI (Application.Run) anzeigen. Der Ärger hier ist, dass das Konsolenfenster immer noch angezeigt wird. Es geht sofort weg, ist aber trotzdem für einen Moment da.

2) Wenn Sie es von einer Konsole aus starten und eine GUI anzeigen, wird die Konsole gesperrt, bis die GUI beendet ist. Dies liegt daran, dass die Konsole (cmd.exe) der Meinung ist, dass sie Console-Apps synchron und Windows-Apps asynchron starten sollte (Unix-Äquivalent von "myprocess &").


Wenn Sie den Ausgabetyp als Windows-Anwendung belassen, aber richtig AttachConsole aufrufen, wird beim Aufruf von einer Konsole kein zweites Konsolenfenster und beim Aufruf vom Explorer keine unnötige Konsole angezeigt . Die korrekte Methode, AttachConsole aufzurufen, besteht darin, -1 zu übergeben. Dadurch wird unser Prozess an die Konsole unseres übergeordneten Prozesses (das Konsolenfenster, mit dem wir gestartet wurden) verbunden.

Dies hat jedoch zwei verschiedene Probleme:

1) Da die Konsole Windows-Apps im Hintergrund startet, wird sofort die Eingabeaufforderung angezeigt und es können weitere Eingaben vorgenommen werden. Das ist zum einen eine gute Nachricht: Die Konsole ist nicht in Ihrer GUI-App blockiert. Wenn Sie jedoch die Ausgabe auf die Konsole übertragen und niemals die GUI anzeigen möchten, wird die Ausgabe Ihres Programms nach der Eingabeaufforderung angezeigt, und keine neue Eingabeaufforderung wird angezeigt angezeigt, wenn Sie fertig sind. Dies sieht etwas verwirrend aus, ganz zu schweigen davon, dass Ihre "Konsolen-App" im Hintergrund ausgeführt wird und der Benutzer andere Befehle ausführen kann, während er ausgeführt wird.

2) Die Stream-Umleitung wird ebenfalls fehlerhaft, z. "myapp some parameters> somefile" kann nicht umgeleitet werden. Das Problem der Stream-Umleitung erfordert eine erhebliche Menge von p/Invoke, um die Standard-Handles zu korrigieren, aber es ist lösbar.


Nach vielen Stunden der Jagd und des Experimentierens bin ich zu dem Schluss gekommen, dass es keine Möglichkeit gibt, dies perfekt zu machen. Sie können einfach nicht alle Vorteile von Konsole und Fenster ohne Nebeneffekte nutzen. Es ist eine Frage der Auswahl, welche Nebenwirkungen für Ihre Anwendung am wenigsten störend sind.

32
Tergiver

Hier ist die beste Methode, die ich gefunden habe: Setzen Sie zunächst den Projekttyp Ihres Projekts auf "Windows-Anwendung" und anschließend "AllocConsole", um ein Konsolenfenster zu erstellen.

internal static class NativeMethods
{
    [DllImport("kernel32.dll")]
    internal static extern Boolean AllocConsole();
}

static class Program
{

    static void Main(string[] args) {
        if (args.Length == 0) {
            // run as windows app
            Application.EnableVisualStyles();
            Application.Run(new Form1()); 
        } else {
            // run as console app
            NativeMethods.AllocConsole();
            Console.WriteLine("Hello World");
            Console.ReadLine();
        }
    }

}
23

Es ist sehr einfach zu tun:

Fügen Sie Ihrer Main-Methode einfach folgendes Attribut und folgenden Code hinzu:

[STAThread]
void Main(string[] args])
{
   Application.EnableVisualStyles();
   //Do some stuff...
   while(!Exit)
   {
       Application.DoEvents(); //Now if you call "form.Show()" your form won´t be frozen
       //Do your stuff
   }
}

Jetzt können Sie WinForms vollständig zeigen :)

6
SharpShade

Sie können ein Winform-Projekt in VS2005/VS2008 erstellen und dann seine Eigenschaften in eine Befehlszeilenanwendung ändern. Es kann dann von der Befehlszeile aus gestartet werden, öffnet jedoch weiterhin eine Winform.

4
David Arno

Sie sollten die Application-Klasse auf dieselbe Weise wie Winform-Apps verwenden können. Der einfachste Weg, ein neues Projekt zu starten, ist wahrscheinlich das, was Marc vorgeschlagen hat: Erstellen Sie ein neues Winform-Projekt und ändern Sie es in den Optionen in eine Konsolenanwendung

0
Grzenio

Das funktionierte für meine Bedürfnisse ...

Task mytask = Task.Run(() =>
{
    MyForm form = new MyForm();
    form.ShowDialog();
});

Das startet das from in einem neuen Thread und gibt den Thread nicht frei, bis das Formular geschlossen wird. Task befindet sich in .NET 4 und höher. 

0
Sunsetquest

Wenn du fliehen willst Formular einfrieren und verwenden Sie die Bearbeitung (wie Text für eine Schaltfläche), verwenden Sie diesen Code

Form form = new Form();
Form.Button.Text = "randomText";
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.Run(form);

Alle obigen Antworten sind eine große Hilfe, aber ich dachte, ich möchte noch ein paar Tipps für den absoluten Anfänger hinzufügen.

Sie möchten also etwas mit Windows Forms in einer Konsolenanwendung tun:

Fügen Sie in Ihrem Console-Anwendungsprojekt im Projektmappen-Explorer einen Verweis auf System.Windows.Forms.dll hinzu. (Rechtsklick auf Lösungsname-> Hinzufügen-> Referenz ...)

Geben Sie den Namensraum im Code an: using System.Windows.Forms;

Deklarieren Sie die erforderlichen Eigenschaften in Ihrer Klasse für die Steuerelemente, die Sie dem Formular hinzufügen möchten.

z.B. int Left { get; set; } // need to specify the LEFT position of the button on the Form

Fügen Sie dann den folgenden Code-Ausschnitt in Main() hinzu:

static void Main(string[] args)
{
Application.EnableVisualStyles();
        Form frm = new Form();  // create aForm object

        Button btn = new Button()
        {
            Left = 120,
            Width = 130,
            Height = 30,
            Top = 150,
            Text = "Biju Joseph, Redmond, WA"
        };
       //… more code 
       frm.Controls.Add(btn);  // add button to the Form
       //  …. add more code here as needed

       frm.ShowDialog(); // a modal dialog 
}
0
Biju Joseph

Es hängt völlig von Ihrer Wahl ab, wie Sie sie umsetzen.
ein. Angehängter Prozess, zB Eingabe in Formular und Ausdruck in Konsole 
b. Unabhängiger Prozess, z. B .: Starten Sie einen Timer, schließen Sie ihn nicht, auch wenn die Konsole beendet wird.

für ein,

Application.Run(new Form1());
//or -------------
Form1 f = new Form1();
f.ShowDialog();

für b, Verwenden Sie einen Thread oder eine Aufgabe, Wie kann ich das Win-Formular unabhängig öffnen?

0
Raj kumar