Wie gehe ich mit Befehlszeilenargumenten in Winforms um, wenn ich das Hauptformular nicht laden möchte?

8

Ich möchte eine App erstellen, die sich wie folgt verhält:

  1. Kein Argument zeigt das Hauptformular
  2. an
  3. Bei Argument "a" wird ein Job ausgeführt, aber das Hauptformular wird nicht geladen.
  4. Beim Argument "b" wird das Formular mit dem übergebenen Argument (load that document)
  5. geladen

Für die 1 und 3 kann ich die Argumente im Konstruktor des Formulars wie folgt behandeln:

%Vor%

Aber dieser Ansatz erlaubt mir nicht, das Verhalten von 2. in der Liste anzuwenden.

In program.cs Ich kann es bearbeiten, um mit den Argumenten umzugehen, bevor das Formular überhaupt erstellt wird. Aber was ist der richtige Ansatz bei der Verwendung von Application.Run() , wenn ich kein Formular weitergeben möchte? Wie werde ich Program klasseninstanz informieren, dass ich eine Nachricht beenden oder anzeigen muss, dass etwas schief gelaufen ist oder sogar ein kleines Taskleistensymbol anzeigt, dass der Prozess etwas tut (Denken Sie daran wie beim Entpacken).

> %Vor%

Würde dieser -Ansatz von MSDN für meine Anwendung korrekt sein?

    
Odys 26.10.2011, 11:15
quelle

4 Antworten

2

Ich fand eine einfache und einfach zu implementierende Lösung anhand des Beispiels in meiner Frage von Microsoft.

Ich habe diese Anwendungskontextklasse erstellt, die für alles in der Anwendung verantwortlich ist. Ich verwende diese anstelle eines Formulars in Application.Run() , wie unten gezeigt. Um das Verhalten in der Frage zu erreichen, verwende ich ein zweites Formular, das ausgeblendet ist und nur das Taskleistensymbol angezeigt wird. Wenn der Benutzer sehen möchte, wie der Prozess vorgeht, kann er auf das Taskleistensymbol klicken und das Protokollierungsfenster sehen, das im folgenden Beispiel die ConfigurationApplierForm ist.

%Vor%

Beachten Sie, dass der Konstruktor privat ist, der Hauptteil innerhalb dieser Klasse und als statisch deklariert ist.

%Vor%

Main ist hier, ein bisschen anders als das Original. Beachten Sie das Argument in der Methode Run

%Vor%

Außerdem müssen wir dem Projekt mitteilen, dass dies das Startup-Projekt ist.

%Vor%     
Odys 26.10.2011, 12:55
quelle
7

Meinst du das genauso wie Visual Studio?

Wenn das der Fall ist, dann können Sie dies nicht in einer normalen Windows-Anwendung tun - Visual Studio-Cheats.

Das Problem besteht darin, dass eine Windows-Anwendung entweder eine Windows Forms-Anwendung oder eine Konsolenanwendung sein kann, aber nicht beides - sie wird zur Kompilierungszeit festgelegt (für .Net-Anwendungen ist dies im Projekteigenschaftenfenster). Ihre Optionen sind:

Machen Sie Ihre Anwendung zu einer Windows Forms-Anwendung

In diesem Fall funktionieren # 1 und # 3 perfekt, aber für # 2 werden Sie feststellen, dass Sie nicht von der Konsole lesen / schreiben können (weil es keine gibt!). Wenn Ihre Anwendung keine Rückmeldung geben muss, dann könnte das in Ordnung sein - machen Sie Ihre Arbeit wie gewohnt und zeigen Sie kein Formular an:

%Vor%

Machen Sie Ihre Anwendung zu einer Konsolenanwendung

In diesem Fall funktioniert # 2 einwandfrei, obwohl # 1 und # 3 gut funktionieren, wird das Konsolenfenster immer im Hintergrund geöffnet sein - wenn Sie das Konsolenfenster schließen, wird Ihre Anwendung beendet.

Das ist wieder in Ordnung, aber persönlich finde ich das ein Hack.

Cheat (mache was Visual Studio macht)

Visual Studio führt einen Cheat durch, indem es zwei separate Anwendungen hat - eine ist eine Konsolenanwendung und die andere ist eine Windows Forms-Anwendung. Die einfache Lösung besteht darin, dies zu belassen und zu erfordern, dass Benutzer beim Ausführen der Befehlszeilenversion eine andere ausführbare Datei starten (z. B. myprogram_g.exe und myprogram_w.exe ).

Visual Studio geht jedoch noch einen Schritt weiter und hat einen einzigen Einstiegspunkt, devenv . Dies geschieht durch die Tatsache, dass die Windows-Shell aus Kompatibilitätsgründen immer eine .com -Datei anstelle von .exe ausführt, wenn Unklarheiten bestehen. Wenn alle Verknüpfungen usw. auf die ausführbare Datei verweisen, wird% code_% in der Befehlszeile ausgeführt, statt dessen wird die devenv -Anwendung ausgeführt, die mithilfe von Magie aussortiert, ob sie als Konsole oder Windows-Anwendung ausgeführt wird.

>

Mein Rat wäre, zwei verschiedene Anwendungen zu erstellen und es dabei zu lassen.

Siehe Wie schreibe ich ein Programm, das entweder als Konsole ausgeführt werden kann oder eine GUI-Anwendung? für mehr Details (lesen Sie unbedingt die Kommentare, die zusätzliche nützliche Vorschläge enthalten).

Siehe auch Wie wird eine Anwendung als GUI- und Konsolenanwendung erstellt? wie devenv.com dies tut.

    
Justin 26.10.2011 11:46
quelle
3

Sie können Application.Run () ohne eine Formularinstanz aufrufen.

Auf diese Weise wird die Nachrichtenschleife gestartet, ohne ein Formular zu öffnen.

Sie können MessageBox.Show () auch aufrufen, bevor Sie .Run () aufrufen.

Sie können sogar ein Formular erstellen und öffnen und anschließend Run () aufrufen, ohne ein Argument anzugeben. Es bedeutet lediglich, dass das Schließen des Formulars die Anwendung nicht automatisch beendet.

z. B.

%Vor%

Wie bereits erwähnt, führt diese Vorgehensweise beim Ausführen von () dazu, dass beim Schließen der Formulare die Anwendung nicht automatisch geschlossen wird. Sie müssen dies in der Close-Event-Handler des Formulars behandeln. (Application.Exit ())

MSDN online kann Ihnen dabei helfen - überprüfen Sie den Hilfe-Eintrag für Application.Run ().

    
Edwin Groenendaal 26.10.2011 11:35
quelle
1

Grundsätzlich möchten Sie eine Konsolenanwendung mit ein paar Änderungen.

Hier ist ein Beispiel, wie Sie beginnen können, indem Sie eine default aboutbox-Klasse verwenden:

%Vor%

Und AboutBox1-Klasse:

%Vor%     
ChrisBD 26.10.2011 11:49
quelle