Forum > Windows

How to get notified, when user unlocks workstation

(1/1)

tboege:
I would like my program to be notified, when a user unlocks windows (eg. after windows+l or automatic LockWorkStation by screensaver og gpo).
I have tried the "sessionchangetest.zip" from https://www.lazarusforum.de/viewtopic.php?f=55&t=9059
I have changed "Execution Level" to "asInvoker"
The codes is like:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---unit Unit1; {$mode objfpc}{$H+} interface uses  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, windows, LMessages; type   { TForm1 }   TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    Button3: TButton;    Memo1: TMemo;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure Button3Click(Sender: TObject);    procedure WndProc(var TheMessage: TLMessage); override;  private    { private declarations }  public    { public declarations }  end; var  Form1: TForm1; implementation {$R *.lfm} { TForm1 } function WTSRegisterSessionNotification(hWnd: HWND; dwFlags: DWORD): BOOL; stdcall external 'Wtsapi32.dll';function WTSUnRegisterSessionNotification(hWnd: HWND): BOOL; stdcall external 'Wtsapi32.dll';function LockWorkStation: BOOL; stdcall external 'User32.dll'; procedure TForm1.Button1Click(Sender: TObject);begin  SetLastError(0);  if WTSRegisterSessionNotification(WindowHandle,0) then Memo1.Lines.Add('REGISTRED');  if GetLastError<>0 then Memo1.Lines.Add('ERROR: '+IntToStr(GetLastError));end; procedure TForm1.Button2Click(Sender: TObject);begin  SetLastError(0);  if WTSUnRegisterSessionNotification(WindowHandle) then Memo1.Lines.Add('UNREGISTRED');  if GetLastError<>0 then Memo1.Lines.Add('ERROR: '+IntToStr(GetLastError));end; procedure TForm1.Button3Click(Sender: TObject);begin  LockWorkStation;end; procedure TForm1.WndProc(var TheMessage: TLMessage);begin  if TheMessage.msg=WM_WTSSESSION_CHANGE then  begin    Memo1.Lines.Add('- WM_WTSSESSION_CHANGE -');  end;  inherited WndProc(TheMessage);end; end. 
If I try to register (by pressing Button1), GetLastError returns 5 - and when the workstation is locked/unlocked, I never get to  line 65: Memo1.Lines.Add('- WM_WTSSESSION_CHANGE -');
The result is the same, if i run the program with elevated rigths.

Any suggestions?

GetMem:
@tboege
https://forum.lazarus.freepascal.org/index.php/topic,30648.msg195843.html#msg195843

       

tboege:
@GetMem
Thank You - it solved my problem (and it works when compiled for 64bit as well as when compiled for 32bit)

Navigation

[0] Message Index

Go to full version