C# Eigenes Win-Dienstprojekt um das Programm zum start zu zwingen?

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Winamp hat doch diese Winamp Agent. Es ist aber keine Windows Dienstdatei, da unter dem Taskmanger->Dienste diese nicht auftaucht. Also ist es ein Programm mit NotifyIcon und Context Menu Strip, das als autostart läuft?

Kennt jemand eine Seite wo man schnell so ähnliches Projekt aufbauen kann? Wie Kriegt man den Autostart des sowas konfiguriert... mit Registry Einträgen?

danke
 
Hier wirds Schritt für Schritt erklärt: klick
btw. das war der 3. Treffer bei google :rolleyes:

Autostart geht entweder über nen Registry eintrag, oder einfach über ne Verknüpfung im Autostart Ordner (Letzteres ist aber eher unschön)

@Cyba_Mephisto
Er will ja eben keinen Dienst haben.
 
Das ist jetzt ein persönlicher Geschmack, kann imo jeder machen wie er will, aber ich finde es "schöner" es über den Autostart Ordner zu machen, da man da leichter und direkter Zugriff drauf hat als auf die Registry (und vor allem auch als unerfahrenerer Nutzer).
 
Grantig schrieb:
Hier wirds Schritt für Schritt erklärt: klick
btw. das war der 3. Treffer bei google :rolleyes:

Autostart geht entweder über nen Registry eintrag, oder einfach über ne Verknüpfung im Autostart Ordner (Letzteres ist aber eher unschön)

@Cyba_Mephisto
Er will ja eben keinen Dienst haben.

es ist nur dann sinnvoll wenn dein programm auch leicht ist ;)

wenn man einen schweren bonzen läd und beim autostart... hmm ich denke nicht dass es jeden gefallen wird wenn die startup zeit sich verdreifacht!
 
@roker
Natürlich soll sich ein Programm micht einfach ohne Rückfrage in den Autostart eintragen.
Es muss mindestends ne Option "beim Start von Windows laden" geben, wo dann der User nen Haken machen kann wenn er will - oder eben auch nicht.

@Backslash
Also ich geh nach dem Prinzip vor: Programme sollen sich in die Registry eintragen, und der Autostart Ordner bleibt dem User überlassen.
Ich hab auch noch nie Software gesehen die ne Verknüpfung im Autostart Ordner anlegt, wenn man die entsprechende Option im Programm auswählt.

Aber im Endeffekt is das natürlich Geschmackssache.
 
System.Diagnostics bietet ausführen von externen programmen.

Code:
Process.Start(pfad);

wie kann ich machen dass mein programm nur als eine instanz geladen werden kann? will ja nicht 100 gleiche fenster haben.

das mit der dienstdatei habe ich gelöst indem ich neues executeable projekt erstellt habe mit notifyicon und dazugehörigen contentmenu.
 
Kennt jemand eine Seite wo man schnell so ähnliches Projekt aufbauen kann? Wie Kriegt man den Autostart des sowas konfiguriert... mit Registry Einträgen?

Start > Ausführen > msconfig ... dann auf Systemstart

wie kann ich machen dass mein programm nur als eine instanz geladen werden kann? will ja nicht 100 gleiche fenster haben.

Es gibt verschiedene Möglichkeiten: wenn es um ein .NET Programm geht, löst du es am besten über einen Mutex den du in der Main mit eindeutigem Namen erzeugst und anschließend dem/der GC per KeepAlive zur Sicherheit mitteilst das er das objekt nicht freigeben soll.

Code:
private static Mutex mutex;

static void Main()
{
     bool first;
     mutex = new Mutex(true,"Eindeutiger Name", out first);
     if(!first)
     {
        return;
     }
     // Nachfolgender Code, Application.Run oder was auch immer
     
     GC.KeepAlive(mutex); // sollte als letzte Zeile im Haupteinstiegspunkt stehen (Main).
}

wenn es um ein "externes" Programm geht musst du entweder über ein Win32 Synchronizationsobjekt gehen oder mit Process.GetProcesses() arbeiten.

Ich hab auch noch nie Software gesehen die ne Verknüpfung im Autostart Ordner anlegt, wenn man die entsprechende Option im Programm auswählt.

Adobe Gamma Loader oder so ^^
 
Zuletzt bearbeitet:
Hab ne Lösung selbst gecodet... falls es jemanden interessiert.
Code:
private void programmStartenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string path                                         = FS.ExecPath + "\\bla.exe";
            //FS SystemFile Classe von mir... da ich von ausserhalb prüfen lasse ob programm läuft
            run                                                 = FS.ExecuteableRun("bla");
            try
            {
                if (run == false)
                {
                    proc                                        = Process.Start(path);
                    run                                         = true;
                    programmStartenToolStripMenuItem.Text       = "Beenden";
                }
                else
                {
                    if (DialogResult.OK == MessageBox.Show("Wollen Sie wirklich beenden?", "Beenden", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                    {
                        proc.CloseMainWindow();
                        run = false;
                        programmStartenToolStripMenuItem.Text   = "Öffnen";
                    }
                }
            }catch(...)
            {
                ....
            }
        }

File System Class, nur ein teil
Code:
public bool ExecuteableRun(string runable)
            {
                foreach (Process p in Process.GetProcesses())
                {
                    if (string.Compare(runable, p.ProcessName) == 0)
                    {
                        //MessageBox.Show("RUN");
                        return true;
                    }
                }
                return false;
            }

So funktioniert es.... sobald mein Programm Läuft, kann ich keine neue instanz aufmachen... sonst wird programm ausgeführt.
Ein besonderer Fall ist noch nicht eingebaut... Hauptprogramm läuft aber Autostart Programm wurde noch nicht ausgeführt. Demzufolge habe ich dann "Öffnen" statt "Beenden" in meinen Menü
 
Zurück
Oben