Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hi zusammen,

hab vor ein paar tagen schon mal die frage für Scripte unter Linux gestellt.

Das hat sich allerdings mittlerweile erübrigt.

Möchte unter C# ein Programm schreiben das beim Systemstart gestartet wird und im hintergrund überwacht ob ein Prozess läuft oder nicht.

Also grob möchte ich ne while schleife haben die so lange ausgeführt wird bis der Porzess nicht mehr läuft.

Habe bis jetzt folgendes:


            string x;

            x = "vmplayer.exe";


            while(Process.GetProcessesByName(x).Length > 0)

            {

                System.Threading.Thread.Sleep(10000);

            }

            System.Diagnostics.Process.Start("shutdown", "-s -t 00");

Hoffe es ist ersichtlich das er solange er die Schleife durchläuft für 10 sek. aussetzt und dann erst neu prüft ob der Prozess läuft.

Wenn der Prozess beendet ist soll er Windows runterfahren.

Wo ist mein Fehler? Denke die While Bedingung ist falsch oder?

Oder bin ich komplett auf dem Holzweg?

Gruß René

Ich glaube du musst das ".exe" beim Prozessname weglassen. Also nur "vmplayer".

Grüße, JasonDelife.

Hier so löse ich das in vb.net habs versucht in C# umzuschreiben aber irgendwie beißt sichs noch:



            System.Diagnostics.Process externprozess = new System.Diagnostics.Process();

            externprozess.StartInfo.WorkingDirectory = "Pfad" ;

            externprozess.StartInfo.FileName = "Filename";

            /* wahlweise externprozess.start() sofern er schon läuft wird dies nicht benötigt*/

            while  (externprozess.HasExited == false)

            {

            /* Anweisung */


            }

           //System.Diagnostics.Process.Start("shutdown", "-s -t 00");


Dank euch. Das Problem war wirklich das .exe :rolleyes:

Das es so einfach war hätte ich glaube ich nie erraten.

Wie gesagt. Danke.

Nur zur Ergänzung:

Windows-Prozesse heißen immer so wie die Datei, aber ohne Endung. Und genau das erwartet GetProcessesByName() auch.

@Gateway_man:

while(externprozess.HasExited == false)
schreibt man besser als:
while(!externprozess.HasExited)

Grüße, JasonDelife.

Nur zur Ergänzung:

Windows-Prozesse heißen immer so wie die Datei, aber ohne Endung. Und genau das erwartet GetProcessesByName() auch.

Suspekt. Ich lass in meinem Projekt (vb.net) auch öfters Prozesse duch Prozessnamen suchen und benutze immer Dateiname.exe.

In der MSDN wird auch kein ".exe" verwendet. Das hat bei mir auch noch nie funktioniert.

http://msdn.microsoft.com/de-de/library/z3w4xdc9.aspx

Grüße, JasonDelife.

Bearbeitet von JasonDelife
Flascher Link

Hab nochmal alles geändert.

Hier mal meine Lösung zu meinem Programm. Klappt hervorragend.

Vielleicht hilfts ja irgendwann irgendjemandem der auch so wenig ahnung hat wie ich. :D


            string x;

            bool check = true;

            x = "vmplayer";


            System.Threading.Thread.Sleep(240000);


            while(check == true)

            {

                Process[] vmplayer = Process.GetProcessesByName(x);

                if (vmplayer.Length > 0)

                {

                    check = true;

                    System.Threading.Thread.Sleep(10000);

                }

                else

                {

                    System.Threading.Thread.Sleep(10000);

                    Process[] vmplayer2 = Process.GetProcessesByName(x);

                    if (vmplayer2.Length == 0)

                    {

                        check = false;

                    }

                }


            }

            System.Diagnostics.Process.Start("shutdown", "-s -t 00");


Nochmal kurz zur Erklärung:

Dieses Programm startet beim Systemstart und fängt nach 4 Minuten an den Prozess "vmplayer" zu überwachen.

Er prüft alle 10 sekunden ob dieser läuft.

Wenn der Prozess nicht mehr läuft prüft er nach 10 sek. nochmal.

Sollte der prozess immernoch nicht mehr laufen, wird der PC heruntergefahren.

Gibt wahrscheinlich schönere und bessere Lösungen aber ich will ja auch FiSi werden und nicht FiAe ;)

Gruß René

wie findet ihr denn die Lösung?

Ist mir bereits bekannt und meines erachtens nicht immer ganz zuverlässig, trotzdem öfters mal hilfreich.

Zu deiner Lösung würd ich sagen das es ne Notlösung ist, aber keines falls sehr elegant. Vor allem der Part wo du die länge vergleichst (was mir eh schleierhaft ist, welche länge da gemeint ist, geschweige denn das dies Funktion ein Member der Prozessklasse ist).

Gibt ja wie ich oben schon erwähnt hatte, extra in der Prozessklasse ein Member welches hasexited heißt, das exakt dafür hergenommen wird.

Aber wenns dir taugt und es funktionert, dann passts ja.

ps:

Das mit der exe würde mich nicht wundern da, wenn man mal in den taskmanager reinschaut stehn die Prozesse auch mit .exe drin. Bsp.: explorer.exe

Mfg

Gateway

Bearbeitet von Gateway_man

Morgen,

habe mein Problem doch noch nicht ganz gelöst.

Wie lasse ich den shutdown befehl als Admin ausführen?

Das Proramm soll ja später auf nem Benutzerkonto laufen ohne adminrechte.

Geh in deinem Projektmappenexplorer mit rechtsklick auf dein Projekt und wähle die Eingeschaften aus.

Dann gehst auf die Kartei Anwendung. Da müsste jetzt neben dem button assemblyinformationen auf ein Button mit "Einstellungen für die Benutzerkontensteuerung" sein. Klick darauf und tausche folgende Zeile aus :

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

mit:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Mfg

Simon

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.