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 ===== | ||