Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Sperrung des Desktops erkennen

  Alt 7. Aug 2007, 15:21
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.
  Mit Zitat antworten Zitat