Différences
Ci-dessous, les différences entre deux révisions de la page.
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 ===== | ||