Laden...

[gelöst] Win-API ExitWindowsEx Problem

Erstellt von Stipo vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.399 Views
Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren
[gelöst] Win-API ExitWindowsEx Problem

Hallo zusammen,

gleich vorweg, das soll nichts böswilliges werden 😉 , sondern ein Tool, was nebenher im Tray laufen soll, und der Benutzer auswählen kann, was nach X-Minuten inaktivität passieren soll.

Ich habe ein kleines Problem mit folgender Methode. Ich möchte, das der angemeldete Benutzer automatisiert ( ohne das der Benutzer eine Interaktion tätigen muss ) am Rechner abgemeldet wird. Dazu habe ich wie im folgenden Code die Methode implementiert.

Nun zu meinem Problem. Wenn ich die Methode ausführe, dann meldet mir Windows ( Vista ) "Folgende Programme sind noch aktiv: " und wartet darauf, das der Benutzer auswählt, ob abgemeldet oder abgebrochen werden soll.

Bei der InitiateSystemShutdownEx Methode aus der Win-API kann man ja den Shutdown erzwingen ( force ), aber was kann ich machen, das ich den LogOff erzwingen kann?.


        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

        public void LogOff()
        {
            if (ExitWindowsEx(ExitWindows.LogOff & ExitWindows.Force, ShutdownReason.MajorOther & ShutdownReason.MinorOther))
            {
                OnLogedOff(EventArgs.Empty);
            }
            else
            {
                this.LastErrHandler(Marshal.GetLastWin32Error());
            }
        }

Über jede kleine Idee und Hinweiß bin ich froh.

Grüße Stephan

1.346 Beiträge seit 2008
vor 14 Jahren

Kannst du nicht einfach shutdown.exe benutzen? mit dem parameter -l meldet man sich von windows ab. bin mir nicht sicher, aber man müsste dann doch mit -f force machen können(?)

Gruß pdelvo

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

Hallo pdelvo,

dein vorschlag mit der shutdown.exe funktioniert zwar, aber ich persönlich finde das nicht gerade eine elegante art, wenn man in einem Programm für eine spezielle Methode ein externes Programm aufrufen muss, das die Methode zu 100% funktioniert.

Ich meine halt, auch die shutdown.exe nutzt ja irgendwie unter der Haube, nativen C++ Code von Windows, um den LogOff zu erzwingen und genau der Code, bzw die anforderung wie man das realisieren muss, suche ich.

Grüße Stephan

J
237 Beiträge seit 2008
vor 14 Jahren

Der WindowsController von Mentalis.org kann das: http://mentalis.org/soft/class.qpx?id=7
Du kannst dir ja den Code ansehen. Wobei man dann auch gleich den nehmen kann 😃.

Grüße, JasonDelife.

Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

Hallo JasonDelife,

danke für den Link. Das hat mich zu meinem Fehler gebracht 😉 Und nachdem ich die Klasse mir durchgesehen habe, dann sind mir darin sehr viele parallelen begnet zu meinem Klassen Aufbau 😉

Auf jedenfall funktioniert mein Code einwandfrei, wenn man einen kleinen schreibfehler behebt 😉 Ein "&" != UND.
Stattdessen muss das folgend geschrieben sein:

ExitWindows.LogOff | ExitWindows.Force

dann klappt das auch mit dem Nachbarn 🙂

Grüße Stephan

C
401 Beiträge seit 2007
vor 14 Jahren

Auf jedenfall funktioniert mein Code einwandfrei, wenn man einen kleinen schreibfehler behebt 😉 Ein "&" != UND.

Das ist so nicht ganz richtig.... Auch ein "&" ist ein und, nur ist ein "&&" short evaluation. Das heisst, dass bei einem "&&" nach dem ersten false abgebrochen wird, wohingegen bei einem "&" trotz auftretender false weitergemacht wird. Dein Code hat jetzt ein "|", welches ein Oder ohne short eval ist, was bedeutet, dass es nicht nach dem ersten true aufhört.

U
1.688 Beiträge seit 2007
vor 14 Jahren

Hallo,

Dein Code hat jetzt ein "|", welches ein Oder ohne short eval ist, was bedeutet, dass es nicht nach dem ersten true aufhört.

Achtung! Es geht hier um Bit-Operationen, nicht um logische.

C
401 Beiträge seit 2007
vor 14 Jahren

Ah... mein Fehler... hab nur auf das if geachtet und den Methodenaufruf übersehen... 😉