Möchte man auf das Sperren und das Entsperren des Desktops (Windows + L) reagieren, muss man die Windows-Nachricht
WM_WTSESSION_CHANGE (
MSDN-Referenz) abfangen. Von
SirThornberry kommt dazu folgender Quellcode:
Delphi-Quellcode:
const
NOTIFY_FOR_ALL_SESSIONS = 1;
type
TForm1 = class(TForm)
{ ... }
private
fRegisterSuccess: Bool;
procedure WMWTSSESSIONCHANGE(var AMsg: TMessage); message WM_WTSSESSION_CHANGE;
end;
function WTSRegisterSessionNotification(AHandle: HWND; AFlags: DWORD): Bool; stdcall external 'wtsapi32.dll';
function WTSUnRegisterSessionNotification(AHandle: HWND): Bool; stdcall external 'wtsapi32.dll';
{ ... }
implementation
procedure TForm1.WMWTSSESSIONCHANGE(var AMsg: TMessage);
begin
case AMsg.WParam of
WTS_SESSION_LOCK:
Memo1.Lines.Add('Gesperrt um: ' + TimeToStr(Time()));
WTS_SESSION_UNLOCK:
Memo1.Lines.Add('Entsperrt um: ' + TimeToStr(Time()));
end;
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fRegisterSuccess := WTSRegisterSessionNotification(Self.Handle, NOTIFY_FOR_ALL_SESSIONS);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if fRegisterSuccess then
WTSUnRegisterSessionNotification(Self.Handle);
end;
Man bedient sich dabei zweier Funktionen, die in der
wtsapi32.dll definiert wurden. Diese sind jedoch nur in Windows XP und Vista verfügbar. Es ist dabei zu beachten, dass das statische Einbinden der Bibliothek bei anderen Windows-Versionen fehlschlagen wird - es empfiehlt sich das dynamische Einbinden der Bibliotheken.