Autor Beitrag
Piano
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 03.09.08 18:00 
Hallo!

Ich hab folgendes Problem und zwar habe ich versucht ein ShutDown programm zu schreiben, weil ich öfters Downloads bis in die Nacht laufen habe.
Leider wurde bei Windows Vista die einstellbare Zeit für die Shutdown.exe "geschmälert". Also hab ich mich hingesetzt und ein kleines Proggi versucht zu schreiben.
Das Problem mit der Zeit habe ich mittels eines Timers versucht zu lösen.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
        private void button1_Click(object sender, EventArgs e)
        {
            Timer t1 = new Timer(); // Timer wird angelegt

            if (eingabe.Text == (""))
            {
                info.ForeColor = Color.Red;
                info.Text = "Bitte geben Sie eine Zeit an !";
            }
            else if (comboBox1.Text == (""))
            {
                info.ForeColor = Color.Red;
                info.Text = "Bitte geben Sie ihr Systemlaufwerk an !";
            }
            else if (button1.Text == ("Abbrechen !"))
            {
                info.ForeColor = Color.Blue;
                info.Text = "Herunterfahren wurde abgebrochen !";
                button1.Text = "Bestätigen !";
                eingabe.Enabled = true;
                comboBox1.Enabled = true;
                jetzt.Visible = false;
                t1.Enabled = false;
            }
            else if (eingabe.Text == ("0"))
            {
                info.ForeColor = Color.Red;
                info.Text = "Bitte geben Sie eine Zeit an !";

            }
            else
            {
                info.ForeColor = Color.Blue;
                info.Text = "Der Computer wird in " + eingabe.Text + " Minute(n) heruntergefahren !";
                jetzt.Visible = true;
                button1.Text = "Abbrechen !";
                eingabe.Enabled = false;
                comboBox1.Enabled = false;
                int x = int.Parse(eingabe.Text);
                t1.Tick += new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
                t1.Interval = (x * 60 * 1000); // Hier wird der Intervall festgelegt
                t1.Enabled = true// Timer wird gestartet
            }
        }

        void t1_Tick(object sender, EventArgs e)
        {
            string y = comboBox1.Text;
            System.Diagnostics.Process.Start(@y + "\\windows\\system32\\shutdown.exe""-s -f");
        }

Es läuft soweit alles wie es soll... Ich gebe die Zeit und das Laufwerk an und er fährt den Computer nachdem der Timer abgelaufen ist herunter... Allerdings wollte ich acuh noch eine Abbrechen Funktion einbauen, die allerdings nicht funktionert. Anstatt das er abbricht wie ich es mit timer.enabled = false eingestellt habe zählt er weiter und fährt den Computer runter. Wenn ich das Herunterfahren mit shutdown.exe -a unterbreche, versucht er das bei eingestellter 1 Minute nochmal ohne, dass ich es dem Programm angeschafft hätte.

Ich hoffe ihr könnt mir helfen. Sollte ich im falschen Forum schreiben, dann tut es mir leid, aber ich bin neu hier!
Danke im Voraus!

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mi 03.09.2008 um 19:09
Einloggen, um Attachments anzusehen!
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Mi 03.09.08 19:01 
Auch wenn du danach nicht gefragt hast: Man führt keine Aktionen durch, indem man externe Programme aufruft, wenn es sich nicht irgendwie vermeiden lässt. Wenn du den PC herunterfahren willst, dann rufe nicht ein externes Programm auf, sondern verwende die .NET-Funktion zum Herunterfahren (wie auch immer die heißt; bin Delphi-Programmierer; aber das müsste ja leicht herauszufinden sein). Diese Vorgehensweise ist aus folgenden Gründen grauenhaft (sorry für die harten Worte, aber ich lese diese shutdown.exe-Variante immer öfter und finde, man muss das eindämmen):
- Probleme, wenn man nicht als Admin angemeldet ist
- Probleme, wenn Windows nicht unter \Windows liegt (häufig bei Win2000 der Fall)
- Probleme, wenn shutdown.exe nicht existiert (z.T. Windows 2000)
- Unnötiges Starten von Prozessen
- Unnötige Abhängigkeiten
- Unnötiger Umweg (was glaubst du, was shutdown.exe macht?
- Ressourcenverschwendung, wenn auch nicht viel
Außerdem - wie ich schon einmal gesagt habe: Wenn du willst, dass der Benutzer Text eingibt, rufst du doch auch nicht den Notepad auf, sondern legst ein Textfeld auf dein Formular. Wenn du willst, dass Ton abgespielt wird, verwendest du die Funktionen des Frameworks und rufst nicht im Hintergrund den Mediaplayer auf. Siehste?

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
Piano Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 03.09.08 19:37 
Okay das hab ich nicht gewusst. Jetzt hab ich dann allerdings die Frage wie der Shutdown Befehl bei der .Net-Funktion heißt.
Wenn du mir da noch weiterhelfen könntest, dass ich wenigstens einen Anhaltspuntk habe.
Ich hab es mir nicht einfach machen wollen oder so, aber ich hab halt gedacht ich schreibe einfach ein Programm mit einem Timer,
welches mir dann den Shutdown Prozess schrebt. Ich danke dir für die Kritik und hoffe, du könntest mir dabei noch helfen!
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Mi 03.09.08 20:27 
user profile iconPiano hat folgendes geschrieben:
Okay das hab ich nicht gewusst. Jetzt hab ich dann allerdings die Frage wie der Shutdown Befehl bei der .Net-Funktion heißt.
Wenn du mir da noch weiterhelfen könntest, dass ich wenigstens einen Anhaltspuntk habe.
Ich hab es mir nicht einfach machen wollen oder so, aber ich hab halt gedacht ich schreibe einfach ein Programm mit einem Timer,
welches mir dann den Shutdown Prozess schrebt. Ich danke dir für die Kritik und hoffe, du könntest mir dabei noch helfen!

Wunderbar, dann weißt du es jetzt. So einsichtige Antworten ließt man nur noch selten.
Habe auf die Schnelle das hier gefunden, aber keine Ahnung ob es funktioniert und vielleicht auch kürzer geht etc. (Gibt es dafür wirklich nix im Framework? Habe nur Codefetzen gefunden, die die Win32-API verwenden.)
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
using System;
using System.Runtime.InteropServices;

namespace ShutDown
{
    class XPShutDown
    {
 [StructLayout(LayoutKind.Sequential, Pack=1)]
     internal struct TokPriv1Luid
 {
     public int Count;
     public long Luid;
     public int Attr;
 }

 [DllImport("kernel32.dll", ExactSpelling=true)]
 internal static extern IntPtr GetCurrentProcess();

 [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)]
 internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

 [DllImport("advapi32.dll", SetLastError=true)]
 internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid );

 [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)]
 internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev,IntPtr relen);

 [DllImport("user32.dll", ExactSpelling=true, SetLastError=true)]
 internal static extern bool ExitWindowsEx(int flg, int rea);

 internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
 internal const int TOKEN_QUERY = 0x00000008;
 internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
 internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
 internal const int EWX_LOGOFF = 0x00000000;
 internal const int EWX_SHUTDOWN = 0x00000001;
 internal const int EWX_REBOOT = 0x00000002;
 internal const int EWX_FORCE = 0x00000004;
 internal const int EWX_POWEROFF = 0x00000008;
 internal const int EWX_FORCEIFHUNG = 0x00000010;

 private static void XPRebootCommand(int flg)
 {
     bool ok;
     TokPriv1Luid tp;
     IntPtr hproc = GetCurrentProcess();
     IntPtr htok = IntPtr.Zero;
     ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok );
     tp.Count = 1;
     tp.Luid = 0;
     tp.Attr = SE_PRIVILEGE_ENABLED;
     ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );
     ok = AdjustTokenPrivileges( htok, falseref tp, 0, IntPtr.Zero, IntPtr.Zero );
     ok = ExitWindowsEx( flg, 0 );
 }

 static void Main()
 {
     XPRebootCommand(EWX_REBOOT + EWX_FORCE);
 }
    }
}

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell