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.