Ceci est une ancienne révision du document !


Interception d'un Message Windows

Interception dans une Classe

Ci dessous on cherche a intercepter le Message Windows WM_DEVICECHANGE dans une class.

Trois étapes :

  1. Dans le Create de notre class, détournement de tous les messages vers la procedure MessageInterceptor
    grâce à lclintf.AllocateHWnd(@MessageInterceptor);
    (ATTENTION AllocateHWnd seul ne fonctionne pas, il faut bien préciser LCLIntf.AllocateHWnd)
  2. Tri et traitement des messages dans la procedure MessageInterceptor
  3. Retransmission du message a la fin de la procedure MessageInterceptor avec AMessage.Result := DefWindowProc(FHandle, AMessage.Msg, AMessage.wParam, AMessage.lParam);
unit uTICDeviceChangeNotifier;
 
{$mode objfpc}{$H+}
 
interface
 
uses
   Classes,
   forms,
   LazLogger,
   LCLIntf, 
   SysUtils,
   windows;
 
type
 
   { TTICDeviceChangeNotifier }
 
   TTICDeviceChangeNotifier = class(TObject)
   private
      FHandle: HWND;
      procedure MessageInterceptor(var AMessage: TMessage);
   protected
   public
      constructor Create; //override;
      destructor Destroy; override;
   published
   end;
 
implementation
 
{ TTICDeviceChangeNotifier }
 
constructor TTICDeviceChangeNotifier.Create;
begin
   inherited Create;
   FHandle := lclintf.AllocateHWnd(@MessageInterceptor);
end;
 
destructor TTICDeviceChangeNotifier.Destroy;
begin
   lclintf.DeallocateHWnd(FHandle);
   inherited Destroy;
end;
 
procedure TTICDeviceChangeNotifier.MessageInterceptor(var AMessage: TMessage);
begin
   if (AMessage.Msg = WM_DEVICECHANGE) then
      DebugLn(TimeToStr(Time) + ' : ' + Format('[%0.4x] - [%0.4x] ',
         [AMessage.wParam, AMessage.lParam]));
   AMessage.Result := DefWindowProc(FHandle, AMessage.Msg, AMessage.wParam,
      AMessage.lParam);
end;
 
 
end.                             
Vous pourriez laisser un commentaire si vous étiez connecté.