IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

capturer les évenements du presse papier


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut capturer les évenements du presse papier
    Bonjour

    je cherche le moyen reconnaitre la présence dans le presse papier de textes présentant des caractéristiques précises.

    Mais je ne sais pas comment détecter depuis une application Delphi les messages systèmes informant que des données sont copiées dans le presse papier PAR UNE AUTRE APPLICATION et je voudrais éviter la solution bestiale consistant à vérifier au hasard à intervalles réguliers par une instance de TClipBoard.

    J'ai testé WindProc mais il semble que cette fonction ne capture que les événements liés à l'application qui l'exécute.

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Tu dois pouvoir faire quelque chose avec SetClipboardViewer
    L'idée serait de définir ton appli en tant que viewer du presse papier.
    De cette façon, tu recevras un message WM_DRAWCLIPBOARD chaque fois que le presse papier est modifié.
    Ensuite libre a toi d'exploiter cette notification comme bon te semble...

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Bonjour, je suis la piste du SetClipboardViewer. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure TForm1.FormActivate(Sender: TObject);
    var msg:Tmsg;
    begin
    Application.ProcessMessages;
    SetClipboardViewer(Form1.Handle);
    end;
     
    function TForm1.WndProc(hWnd : HWND; Msg : UINT; WParam : WPARAM; LParam: LPARAM): UINT; stdcall;
    begin
         case Msg of
              WM_DRAWCLIPBOARD  :
              begin
              Form1.Memo1.clear;
              Clipb:=clipboard;
              Form1.Memo1.lines[0]:=Clipb.AsText;
              Form1.StatusBar1.panels[0].Text:=inttostr(Form1.Memo1.Lines.count)+' lignes';
              end;
         end;
         Result := DefWindowProc(hwnd, Msg, wParam, lParam);
    end;
    Or bien que le compilateur dise "la méthode WndProc cache la méthode virtuelle" cette procédure semble éliminée par le lieur. Elle ne capture aucun événement apparemment. J'ai pompé cette procédure dans un projet qui crée sa propre fiche. Que manque t il à mon code pour les messages d'évenement soient traités par WndProc redéfini ?

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Bon, ca y est. Voici le code ad-hoc ! Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    Application.ProcessMessages;
    SetClipboardViewer(Form1.Handle);
    end;
     
    procedure TForm1.WndProc(var Msg: TMessage);
    begin
    inherited;
         case Msg.Msg of WM_DRAWCLIPBOARD  :
              begin
              Memo1.clear;
              Clipb:=clipboard;
              Memo1.lines[0]:=Clipb.AsText;
              StatusBar1.panels[0].Text:=inttostr(Memo1.Lines.count)+' lignes';
              end;
         end;
    end;

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Juste une remarque : En Delphi tu n'as pas besoin de surcharger WndProc pour traiter un message windows (même si c'est effectivement une possiblité).
    Il te suffit de définir une procédure de message dans ta form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    type
      TForm1 = class(TForm)
    ...
      private
        procedure DrawClipBoard(var msg : TMsg); message WM_DRAWCLIPBOARD;
      end;
     
    procedure TForm1.DrawClipBoard;
    begin
      Memo1.clear;
      Clipb:=clipboard;
      Memo1.lines[0]:=Clipb.AsText;
      StatusBar1.panels[0].Text:=inttostr(Memo1.Lines.count)+' lignes';
    end;
    La VCL se chargera toute seule d'analyser les messages reçus par la form et de déléguer son traitement sur la procédure de message.

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Oui, merci c'est en effet bien plus élégant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/07/2014, 11h59
  2. [Débutant] J'arrive pas à copier les images du presse-papier
    Par NetLandGim dans le forum C#
    Réponses: 3
    Dernier message: 23/10/2011, 09h28
  3. Coller les données du presse papiers dans Excel
    Par Souri84 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/01/2010, 10h48
  4. Capturer les évenements déclenché par un scanner
    Par shirya dans le forum VB.NET
    Réponses: 0
    Dernier message: 23/04/2009, 21h52
  5. Réponses: 2
    Dernier message: 02/06/2007, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo