Autor Beitrag
UTA2000
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 27.03.03 09:39 
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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 :)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 ?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mi 11.06.03 09:27 
Hi!

Entweder mit einem Notification Package, siehe MSDN: msdn.microsoft.com/l...registry_entries.asp wobei WLEventLock wohl für Dich interessant sein dürfte oder mit dieser Funktion

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: 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