Entwickler-Ecke
Windows API - Wie kann ich herausfinden, ob das System gesperrt ist?
UTA2000 - Do 27.03.03 09:39
Titel: Wie kann ich herausfinden, ob das System gesperrt ist?
Hi,
wir arbeiten in einer Netzwerkumgebung. In dieser ist es möglich, den Rechner zu sperren, wenn man irgendwo hin geht. Auch bei Aktivierung des Bildschirmschoners ist der Rechner dann gesperrt.
Wie kann ich genau diesen Sperr-Zustand mit Delphi erkennen?
UTA2000
Delete - Do 27.03.03 10:21
Knifflig, knifflig. Ich habe gerade mal im PSDK gekuckt, aber Windows scheint keine Nachricht zu schicken, wenn der Rechner gesperrt wird. Warum auch, es läuft ja alles weiter, als wenn der Benutzer davor sitzt, nur dass man erst den Rechner entsperren muß, um weiterzuarbeiten.
Warum willst du das wissen? Was willst du machen? Eventuell gibt es eine andere Lösung.
UTA2000 - Do 27.03.03 10:39
Das dauert verdammt lang, das zu erklären. Aber ich versuchs mal kurz:
Ich habe ein Programm geschrieben, welches im SysTray läuft und tagesaktuell Start- und Endzeit des Programms protokolliert und nutzt. Startzeit wird bei Windows- bzw. Programmstart gesetzt, Endzeit bei Beendigung bzw. Shutdown gesetzt.
Nun gibt es aber Nutzer, die den Rechner nicht ausschalten/neustarten sondern einfach von heute auf morgen (usw.) anlassen und nur sperren.
Damit ist natürlich die Startzeit am nächsten Tag von gestern (oder noch früher) und die Endzeit des gestrigen Tages gibts gar nicht, da das Programm nicht beendet worden ist, bzw. Windows nicht runter gefahren wurde.
Also, dachte ich mir, stürze ich mich auf den Sperr-Dialog. Checke, wann er das letzte mal vor Mitternacht gesperrt worde ist und setze diese Zeit dann als Endzeit....oder so ähnlich :)
Delete - Do 27.03.03 10:47
Mir sind zwei Möglichkeiten eingefallen:
1. Man kuckt mit Spy++ ob nicht doch eine Message kommt. Eventuell muß man sich selbst einen Systemhook basteln, um zu kucken was genau passiert.
2. oder man sagt, wenn so und so lange nichts am Computer passiert ist, dass man dann davon ausgeht, dass der Benutzer nach Hause gegangen ist. dazu ist aber ein SystemHook nötig. Und beobachten würde ich die API CreateWindow. Aber das ist nicht so das ware, da ein Systemhook, das System doch belastet und ausbremst, da ja erst alles Nachrichten und API-Calls durch den Hook durch müssen.
UTA2000 - Do 27.03.03 10:56
Mensch, das ist aber unbefriedigend :D
Und Spy++ kenn ich gar nicht, so tief bin ich anscheinend gar nicht drin?!
Was hälst Du von Key- oder MouseHooks. Mir fällt bei diesen beiden Hooks aber das Risiko ein, dass man nicht zwangsläufig davon ausgehen kann, dass er nach Hause gegangen ist, wenn sich bis Mitternacht nichts getan hat, vielleicht hat er lange telefoniert :D ?
Delete - Do 27.03.03 11:16
Das ist das Problem.
Und ich sehe gerade der Spy++ liefert auch nichts gescheites. warte mal noch etwas eventuell hat hier ja noch jemand anderst eine idee.
Houserocker - Di 10.06.03 18:49
Titel: Bildschirmschoner
Wie wär's damit nen eigenen Bildschirmschoner zu schreiben der dann "Pflicht" für alle user is und der die deine Message schickt?
DaFox - Mi 11.06.03 09:27
Hi!
Entweder mit einem Notification Package, siehe MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/registry_entries.asp wobei WLEventLock wohl für Dich interessant sein dürfte oder mit dieser Funktion
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function GetDesktopName: string; var Desktop: HDESK; LengthNeeded: Cardinal; Name: string; begin Desktop := OpenInputDesktop(0, False, DESKTOP_READOBJECTS); if Desktop <> 0 then begin SetLength(Name, 255); Win32Check(GetUserObjectInformation(Desktop, UOI_NAME, @Name[1], 255, LengthNeeded)); Result := Name; CloseDesktop(Desktop); end else Result := 'Error: ' + SysErrorMessage(GetLastError); end; |
die Du als Service unter dem LocalSystem account laufen lässt (Achtung: Interactive flag muss gesetzt sein!).
Es sei noch gesagt, dass der erste Weg (Winlogon Notification Package) erst ab Windows 2000 funktioniert, der zweite bereits ab Windows NT, jedoch ist dieser natürlich weniger schön.
It's up to you! :wink:
Gruß,
Markus
DaFox - Mi 11.06.03 09:32
Ich vergas zu erwähnen, dass die Funktion GetDesktopName "Winlogon" für eine gesperrte Workstation und "Default" für nicht gesperrte Workstation zurückgibt.
Gruß,
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!