Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
prog:lazarus:cas:wm_messages:intercepter [15/02/2023 15:14]
thierry [Sources & Ressources]
prog:lazarus:cas:wm_messages:intercepter [18/03/2023 12:41] (Version actuelle)
thierry [Interception d'un Message Windows]
Ligne 1: Ligne 1:
 ====== Interception d'un Message Windows ====== ====== Interception d'un Message Windows ======
 +===== Intercepter les WMMessages d'un TForm =====
 +On detourne WNDProc avec la function ''​Windows.WNDPROC(SetWindowLongPtr(AFormHandle,​ GWL_WNDPROC,​ PtrUInt(@NewWndCallback)));''​
 +<code delphi uWMInterceptor.pas>​
 +unit uWMInterceptor;​
 +
 +{$mode ObjFPC}{$H+}
 +interface
 +
 +uses
 +  SysUtils, ​ Forms, ​ Controls, ​ Windows, LazLogger;
 +var
 +  OldWndProc: WNDPROC;
 +
 +procedure InitWMInterception(AFormHandle:​ THandle);
 +
 +implementation
 +
 +function NewWndCallback(Ahwnd:​ HWND; uMsg: UINT; wParam: WParam;
 +  lParam: LParam): LRESULT; stdcall;
 +begin
 +   { Traitement des messages intercéptés }
 +  case uMsg of
 +    WM_DEVICECHANGE:​ debugLn('​Message : %x, %x, %x', [uMsg, wParam, lParam]);
 +  end;
 +  ​
 +  { Appel de l'​ancienne WNDProc }
 +  Result := Windows.CallWindowProc(OldWndProc,​ Ahwnd, uMsg, WParam, LParam);
 +end;
 +
 +procedure InitWMInterception(AFormHandle:​ THandle);
 +begin
 +  if AFormHandle <> 0 then
 +  ​
 +     { Defini NewWndCallback comme nouvel intercepteur et stock l'​ancien dans OldWinProc }
 +    OldWndProc := Windows.WNDPROC(SetWindowLongPtr(AFormHandle,​ GWL_WNDPROC,​ PtrUInt(@NewWndCallback)));​
 +end;
 +
 +end.
 +</​code>​
 +
 ===== Interception dans une Classe ===== ===== Interception dans une Classe =====