Entwickler-Ecke
Windows API - Testen, ob System gesperrt ist ?
pHaRyNx - Mo 08.09.08 14:29
Titel: Testen, ob System gesperrt ist ?
hallo.
im rahmen einer kindersicherung habe ich eien knopf eingerichtet, der das system via "LockWorkStation;" sperrt und aufhört, die zeit zu messen.
wie kann jetzt abfragen, ob das system noch immer gesperrt ist oder bereits wieder entsperrt wurde ? (weil die zeit, die vergeht, wärend das system gesperrt ist, soll nicht gezählt werden...)
mfg pHaRyNx
BenBE - Mo 08.09.08 15:10
IsWorkstationLocked, gibt's ne Funktion hier im Forum dazu. Funktioniert im Wesentlichen damit, dass man prüft, ob man den Tesktop wechseln kann.
pHaRyNx - Mo 08.09.08 17:29
ich habe mal gesucht, aber unter IsWorkStationLocked nix gefunden außer diesen beitrag und einen anderen, in dem du auch schreibst, dass es eine solche funktion hier im forum gibt...
Marc. - Mo 08.09.08 17:36
Keine Minute googeln:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function IsWorkstationLocked: Boolean; var hDesktop: HDESK; begin Result := False; hDesktop := OpenDesktop('default', 0, False, DESKTOP_SWITCHDESKTOP); if hDesktop <> 0 then begin Result := not SwitchDesktop(hDesktop); CloseDesktop(hDesktop); end; end; |
cu,
Marc
pHaRyNx - Di 09.09.08 18:19
vielen dank für die funktion. funktioniert eins A.
mfg pHaRyNx
edit
ich habe jetzt unter vista damit nur ein problem: wenn ich z.b. die lan-verbindung deaktivieren will, dann kommt stadardmäßig das fenster: "Benutzerkontensteuerung: Zur Fortsetzung des Vorgangs ist Ihre Zustimmung erforderlich..."
und wenn ich mit IsWorkstationLocked teste, dann wird mir gemeldet, dass das System gerade gesperrt ist. was kann ich dagegen tun ?
BenBE - Di 09.09.08 18:55
Ich denk mal, damit das unter AstaLa Vista klappt, musst Du dir VOR der Prüfung über das UAC die nötigen Rechte bestätigen lassen, bzw. dein Programm über ein Manifest bereits mit höheren Rechten starten lassen. Das Tauschen des Desktops ist nicht um sonst eine privilegierte Aktion, da man das auch sehr nett missbrauchen kann ...
pHaRyNx - Di 09.09.08 19:16
nee, denke nicht. das abfragen via IsWorkstationLocked klappt ja an sich, nur wird bei vista anscheinend auch das system gesperrt, wenn diese doofe benutzerkontenmeldung ("Benutzerkontensteuerung: Zur Fortsetzung des Vorgangs ist Ihre Zustimmung erforderlich..." ) kommt...naja, es klappt an sich, nur muss ich jetzt auf eine funktionalität des programms verzichten...aber das geht schon ;)
danke nochmals.
mfg pHaRyNx
Dezipaitor - Di 09.09.08 19:26
Nutzt IsWorkstationLocked nur nicht im SYSTEM Kontext! Sonst schaltet es den Desktop um. Richtig wäre es wohl imho, den InputDesktop zu ermitteln und mit dem "default"-Desktop zu vergleichen (müsste man mal ausprobieren). Kommt man schon an den Inputdesktop nicht ran, dann ist der normale Desktop gesperrt.
PS. UAC läuft auf dem Winlogon Destkop. Das ist so gut wie ein gesperrtes SYSTEM.
BenBE - Di 09.09.08 19:56
Dezipaitor hat folgendes geschrieben: |
Nutzt IsWorkstationLocked nur nicht im SYSTEM Kontext! Sonst schaltet es den Desktop um. Richtig wäre es wohl imho, den InputDesktop zu ermitteln und mit dem "default"-Desktop zu vergleichen (müsste man mal ausprobieren). Kommt man schon an den Inputdesktop nicht ran, dann ist der normale Desktop gesperrt. |
Der Desktop 'default' ist der Standard-Desktop, auf dem man Arbeitet. OK, wenn man sich mit CreateDesktop noch paar andre anlegt gerät die Funktion aus'm Tritt, das tut sie aber immer, wenn sie das Recht zum Wechseln des Desktops hat.
Schreib sie dann doch halt mal richtig, mit Abfrage des Input-Desktops und allen weiteren Vergleichen ...
Dezipaitor - Di 09.09.08 23:00
In PseudoCode aus SuRun. (thx Kay)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function IsLocked : boolean; var Desk : HDESK; Name : Array[0..4095] of AnsiChar; len : Cardinal; begin result := true; Desk := OpenInputDesktop(0, false, DESKTOP_SWITCHDESKTOP); if Desk = 0 then exit;
len := sizeof(Name); if not GetUserObjectInformationA(Desk, UOI_NAME, @Name, len, len) then exit;
if (CompareText(Name,'Winlogon') = 0) or (CompareText(Name,'Disconnect') = 0) or (CompareText(Name,'Screen-Saver') = 0) then result := true else result := false; end; |
Geupdated und bei mir funkz es als normaler Benutzer, Administrator und SYSTEM. Nur mit dem Screensaver muss noch ein Test gemacht werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!