Announcement

Collapse
No announcement yet.

Programm mit Parameter starten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Programm mit Parameter starten

    Hallo

    Wie kann ich meinem Programm Parameter mitgeben?

    Wenn ich mein Programm folgendermassen starte:
    Programm.exe /c

    Dann möchte ich, dass eine Funktion aus der Form1 ausgeführt wird.

    Wie kann ich die machen?

    Danke für eure Hilfe.

  • #2
    Hallo,

    ein Programm mit zusätzlichen Parametern zu starten geht über Befehlszeilenargumente. Diese werden dann in der Haupteinstiegsfunktion des Programms verarbeiter (oder auch nicht).
    [highlight=c#]
    static void Main(string[] args)
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(fals e);
    Application.Run(new Form1());
    }
    [/highlight]

    Um damit eine Funktion aus Form1 auszuführen kann du den Kontruktor der Form1 überladen oder mittels Reflektion die Funktion aufrufen.
    Vielleicht wäre es einfacher wenn die Funktion direkt in Program.cs stehen würde.

    Gib bitte nähere Infos an was genau du willst und warum, denn vielleicht ist WinForm nicht der passende Projekttyp.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Es ist ein Programm welches normalerweise in der Taskleiste angezeigt wird und ein Programm startet, wenn der Client sich an unserer Domäne befindet, wenn sich der Client von unserem Netz trennt dann wird das Programm wieder beendet, dies wurde so erstellt weil es ein Synchronisationstool ist.

      Wenn ich auf das Icon klicke erscheint eine Blase, wenn ich dann auf diese Blase klicke werden Files von einem Verzeichnis in ein anderes kopiert.

      Nun möchte ich das Programm per Parameter so starten können, damit gleich die Daten kopiert werden (Für den ersten start).

      Habe ich in der Main-Funktion die gleichen Möglichkeiten wie in der Form1 für die Programmierung?
      Oder gibt es da einschränkungen?
      Ich könnte eigentlich komplett auf die Form1 verzichten, wenn ich in der Main-Funktion ebenfalls ein Icon in der Taskleiste starten könnte.

      Comment


      • #4
        Hallo,

        hab ein kleines Bsp geschrieben. Anwendungstyp = WinForm.

        [highlight=c#]
        using System;
        using System.Windows.Forms;

        namespace WindowsFormsApplication1
        {
        class Program
        {
        private static NotifyIcon notify = new NotifyIcon();
        //---------------------------------------------------------------------
        [STAThread]
        static void Main(string[] args)
        {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(fals e);

        // Kontexmenü:
        ContextMenu cm = new ContextMenu();
        MenuItem mi = new MenuItem();
        mi.Text = "Beenden";
        mi.Click += new EventHandler(Exit_Click);
        cm.MenuItems.Add(mi);

        // NotifyIcon -> wichtig: Icon-Eigenschaft, sonst sieht man nichts!
        notify.Visible = true;
        notify.Icon = Properties.Resources.icoTiming;
        notify.ContextMenu = cm;
        notify.Click += new EventHandler(Notify_Click);

        // Befehlszeilenargument:
        if (args[0] == "/c")
        {
        CopyFiles();
        }

        // wichtig -> sonst geht nix!
        Application.Run();
        }
        //---------------------------------------------------------------------
        private static void Exit_Click(Object sender, EventArgs e)
        {
        notify.Dispose();
        Application.Exit();
        }
        //---------------------------------------------------------------------
        private static void Notify_Click(Object sender, EventArgs e)
        {
        notify.ShowBalloonTip(
        10,
        "Titel",
        "Kopieren wie in Post",
        ToolTipIcon.Info);
        }
        //---------------------------------------------------------------------
        public static void CopyFiles()
        {
        notify.ShowBalloonTip(
        10,
        "Titel",
        "Kopieren gestartet",
        ToolTipIcon.Info);

        // Kopieren...
        System.Threading.Thread.Sleep(100);

        notify.ShowBalloonTip(
        10,
        "Titel",
        "Kopieren beendet",
        ToolTipIcon.Info);
        }
        }
        }
        [/highlight]

        Hoffe es hilft.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Danke vielmals für deine Hilfe. Ist viel mehr als ich erhofft habe :-)

          Werde den Code anpassen und ausprobieren.
          Gebe dann ein kurzes Feedback, ob es funktioniert.

          Comment


          • #6
            Hi gfoidl

            Mit den folgenden Zeile besteht ein Problem:
            notify.Icon = Properties.Resources.icoTiming;

            if (args[0] == "/c")
            Meldet dass Index ausserhalb des Bereichs ist, wenn ich kein /c angebe, habe ich nun mal provisorisch auf args.ToString() abgeändert.


            Kannst du mir bitte weiterhelfen?
            Zuletzt editiert von Chrone; 06.08.2008, 12:52.

            Comment


            • #7
              Hallo,

              der Icon-Eigenschaft des NotifyIcons muss ein Icon (Symbol) zugewiesen werden. Dieses Symbol kann im Dateisystem liegen oder als Resource in der Assembly.
              Letzteres ist hier der Fall.

              Um ein Symbol als Resource einzufügen sind folgende Schritte notwendig:
              1. Resourcen-Designer starten (siehe Abbildung im Anhang)
              2. über Menü "Resource hinzufügne" das Icon hinzufügen

              Der Designer erstellt dann Code für den Zugriff auf die Resource - hier: das Icon
              Mittels
              [highlight=c#]
              notify.Icon = Properties.Resources.icoTiming;
              [/highlight]
              wird dann (mittels Designer generiertem Code) auf die Resource zugegriffen.

              Dies ist sehr praktisch. Es können alle möglichen Resourcen auf diese Weise hinzugefügt und verwendet werden.

              mfG Gü
              Attached Files
              Zuletzt editiert von gfoidl; 06.08.2008, 12:52. Reason: Anhang vergessen
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Danke nun klappt es.

                Nun kommt ein weiteres Problem, wenn mit dem Paramerter /c starte, dann öffnet sich zwar das Icon aber sonst passiert nichts. Es müsste ja eigentlich eine Blase mit "Kopieren gestartet" erscheinen, oder?

                Kopiervorgang startet auch nicht, wenn ich auf das Icon klicke. Es erscheint nun eine Blase mit dem Text "Kopieren wie in Post" wenn ich nun nochmals darauf klicke, dann passiert ebefalls nichts hier müsste ja auch "Kopieren gestartet" erscheinen, oder?

                P.S habe meinen Beitrag vorhin noch zitiert, Betreffend dem args-Array.

                Comment


                • #9
                  Hallo,

                  das Verhalten stimmt schon. Der Code für das Kopieren ist in meine Bsp. nicht enthalten da ich nicht weiß was wohin kopiert werden soll - ist eben nur ein Bsp.

                  Um das Kopieren zu ermöglichen muss dein Code dafür in die Ereignishandler geschrieben werden bzw. von dort eine Methode zum Kopieren aufgerufen werden. D.h. ersetzen von Zeile 63 und ergänzen unter Zeile 51 im Code-Bsp.

                  Ansonsten bitte genauer schreiben was du willst.

                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    Bezüglich Befehlszeilenargument habe ich vergessen zu Prüfen ob überhaupt welche vorhanden sind.
                    Korrekt muss es heißen:
                    [highlight=c#]
                    // Befehlszeilenargument:
                    if (args.Length != 0 && args[0] == "/c")
                    {
                    CopyFiles();
                    }
                    [/highlight]

                    Fürs Debuggen kann unter den Projekteigenschaften ein Befehlszeilenargument gesetzt werden (siehe Anhang).

                    mfG Gü
                    Attached Files
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Hi

                      Habe nun die Software mit meinen benötigten Features angepasst und es läuft.

                      Danke dir vielmals


                      Ich habe nun noch ein unschönes Problem.

                      Wenn ich auf das Icon einen Rechtsklick mache, dann habe ich Beenden durch Info ausgetauscht. Es erscheint dann eine MessageBox. Nun erscheint jedoch auch jedes mal noch die gelbe Blase.
                      Kann man dies irgendwie anpassen, dass die Blase nur erscheint, wenn ich mit der linken Maustaste auf das Icon klicke?

                      Wie kann man einstellen, dass die Blase nach 2 Sekunden wieder verschwindet?

                      Comment


                      • #12
                        Hallo,

                        Für linke, rechte Maustaste muss das Ereignis geändert werden. D.h. ersetzten der Codezeile notify.Click += ... mit
                        [highlight=c#]
                        notify.MouseClick += new MouseEventHandler(Notify_MouseClick);
                        [/highlight]

                        und ändern der Ereignisbehandlung zu
                        [highlight=c#]
                        private static void Notify_MouseClick(Object sender, MouseEventArgs e)
                        {
                        if (e.Button == MouseButtons.Right)
                        MessageBox.Show("Info");
                        else
                        {
                        notify.ShowBalloonTip(
                        2,
                        "Titel",
                        "Kopieren wie in Post",
                        ToolTipIcon.Info);
                        }
                        }
                        [/highlight]
                        Eventuell muss das Kontexmenü noch entfernt werden.


                        Zur Anzeigedauer:
                        Der minimale und maximale Timeoutwert (10 bzw. 30 Sekunden) werden vom Betriebssystem erzwungen und liegen normalerweise zwischen 10 und 30 Sekunden. Dieser kann je nach Betriebssystem unterschiedlich ausfallen. Zu hohe bzw. niedrige Timeoutwerte werden auf den entsprechenden maximalen bzw. minimalen Wert korrigiert. Wenn der Benutzer außerdem keine Aktionen auf dem Computer ausführt (es treten keine Tastatur- oder Mausereignisse ein), berücksichtigt das System diese Zeit bei der Berechnung des Timeouts nicht. (Quelle: MSDN)

                        Um dennoch eine geringere Anzeigedauer als die 10 Sekunden zu erreichen muss ein Trick verwendet werden.
                        Folgender Code hilft:
                        [highlight=c#]
                        notify.ShowBalloonTip(
                        2, // bringt nichts -> da Minimum 10000
                        "Titel",
                        "Kopieren wie in Post",
                        ToolTipIcon.Info);

                        // 2 Sekunden warten:
                        System.Threading.Thread.Sleep(new TimeSpan(0, 0, 2));

                        // Aus- und Einblenden:
                        notify.Visible = false;
                        notify.Visible = true;
                        [/highlight]

                        mfG Gü
                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                        Comment


                        • #13
                          Vielen vielen Dank. Jetzt ist es perfekt.
                          Ach ja, ich habe es folgendermassen angepasst:
                          Die If Abfrage habe ich auf die linke Maustaste genommen, damit nur dann die Blase erscheint.
                          Wenn ich nun mit der rechten Maustaste auf das Icon klicke, dann erscheint wie vorhin zuerst ein Info (Wie beim Beenden) und dann kann ich die MessageBox anzeigen lassen.

                          Danke dir vielmals für deine Hilfe und deine Zeit.

                          Comment

                          Working...
                          X