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

Lazarus Pascal Discussion :

Copier l'image et détecter les placements de la souris dans une autre application


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Copier l'image et détecter les placements de la souris dans une autre application
    Bonjour à toutes et à tous,

    Soit une application "lambda" présente en premier plan sur l'écran de mon ordinateur. Dans un application que je souhaite créer et qui tournerait donc en second plan, je voudrais pouvoir copier une partie de l'image que présente l'application "lambda", cette partie étant délimitée par deux positions de la souris

    Cela exige, de la part de mon application, d'être capable de détecter la position de la souris dans l'application "lambda" et d'être capable de copier l'image délimitée par les positions de la souris.

    Est-ce possible ? Si oui, par quel biais aborder le problème ? Est-ce la gestion des messages ? (ça fait une bonne décennie que je n'ai pas jouer avec cela )

    Cordialement.

    Pierre

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Sous Windows,

    Pour la souris, tu peux le faire en interceptant ses messages à l'aide d'un hook ou par Raw Input.

    Hook :
    Est contenu dans une DLL qui sera injectée dans le processus cible (voire tous les processus si le ThreadId est non défini) et s'installe par SetWindowsHookEx en spécifiant WH_MOUSE (évite les hooks de bas niveau (WH_MOUSE_LL) qui ne sont plus vraiment supportés).
    Le principe est synchrone, l'information doit par conséquent être traitée très rapidement sous peine de pénaliser le système complet (cf. ThreadId ci-dessus). Le mieux dans le cas présent est de simplement router le message par PostMessage vers ton application.

    Raw Input :
    Une fenêtre de l'application s'enregistre dans la chaîne de notification par RegisterRawInputDevices. Elle reçoit ensuite l'information par message WM_INPUT.
    Le principe est asynchrone.


    L'image peut ensuite être copiée en récupérant le device context de la source (GetDC) et la dupliquer sur un DC cible par BitBlt.

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci Andnotor pour ces suggestions. J'ai oublié de préciser que je souhaite que cela fonctionne aussi sous Linux.

    Est-ce le cas pour ce que tu me suggères ?

    Cordialement.

    Pierre

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Sous Windows,

    Pour la souris, tu peux le faire en interceptant ses messages à l'aide d'un hook ou par Raw Input.

    Hook :
    Est contenu dans une DLL [...]
    --snip--
    Citation Envoyé par ChPr Voir le message
    J'ai oublié de préciser que je souhaite que cela fonctionne aussi sous Linux.

    Est-ce le cas pour ce que tu me suggères ?
    Surement pas, non ! Les dll's sont inconnues dans cet environnement,

    En ce qui me concerne, je fais une copie d'écran classique de tout le bureau, que je fais ensuite afficher par-dessus tout ce qui y est affiché, et c'est là-dessus que je vais détecter puis recopier le rectangle délimité par les mouvements de la souris.

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... En ce qui me concerne, je fais une copie d'écran classique de tout le bureau ...
    Ça, c'est la touche "Imp.écr.Syst", oui, non ?

    Citation Envoyé par Jipété Voir le message
    ... que je fais ensuite afficher par-dessus tout ce qui y est affiché ...
    Comment fais-tu ? C'est une touche, une fonction ?

    Cordialement.

    Pierre

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Ça, c'est la touche "Imp.écr.Syst", oui, non ?
    Pas du tout !
    Je fais ça par code (mais je ne l'ai pas sous la main, là), et ça génère un TBitmap (un grand classique facilement trouvable sur le web).

    Citation Envoyé par ChPr Voir le message
    Comment fais-tu ? C'est une touche, une fonction ?
    C'est une fiche sans bordures, sans menus, sans caption, sur laquelle se trouve un TImage aligné avec alClient et chargé avec le bitmap provenant de la ligne précédente, la fiche étant positionnée par-dessus tout le monde.

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    ...
      private
        { private declarations }
        Rect4Selection :TRect;
        FStartPoint, FEndPoint: TPoint;
        procedure WMEraseBkGnd( var message: TLMERASEBKGND );
        function GetDragRect: TRect;
      public
        { public declarations }
        Bmp4Selection: TBitmap;
        ZoneCopieFaite: boolean;
        FullCopieFaite: boolean;
        FormCopieFaite: boolean;
        Echapp: boolean;
        property DragRect: TRect read GetDragRect;
      end;
     
    procedure Tfrm4CopieEcran.DrawDragRect;
    begin
      DrawFocusRect(Canvas.Handle, DragRect);
    end;
     
    function Tfrm4CopieEcran.GetDragRect: TRect;
    begin
      Result.Left   := Min( FStartpoint.X, FEndPoint.X );
      Result.Top    := Min( FStartpoint.Y, FEndPoint.Y );
      Result.Right  := Max( FStartpoint.X, FEndPoint.X );
      Result.Bottom := Max( FStartpoint.Y, FEndPoint.Y );
    end;
     
    // copie d'une région sélectionnée à la souris
    procedure Tfrm4CopieEcran.imgMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then begin
        FStartPoint:= Point( X, Y );
        FEndPoint  := FStartPoint;
        MouzeDown  := true;
        DrawDragRect;
      end; { if }
    end;
     
    procedure Tfrm4CopieEcran.imgMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if MouzeDown then begin
        DrawDragRect;
        FEndPoint:= Point( X, Y );
        DrawDragRect;
      end; { if }
    end;
     
    procedure Tfrm4CopieEcran.imgMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      tmp: integer;
    begin
      if MouzeDown then begin
        DrawDragRect;
        FEndPoint:= Point( X, Y );
        MouzeDown := False;
     
        with Rect4Selection do begin
          Left:= FStartPoint.X; Top:= FStartPoint.Y;
          Right:= FEndPoint.X; Bottom:= FEndPoint.Y;
          // en cas de sélection à l'envers :
          if Left > Right then begin tmp := Left; Left := Right; Right := tmp; end;
          if Top > Bottom then begin tmp := Top; Top := Bottom; Bottom := tmp; end;
        end;
     
        with Bmp4Selection do begin
          PixelFormat := pf24bit;
          with Rect4Selection do begin
            Width := Right-Left; Height := Bottom-Top;
          end;
          Application.ProcessMessages;
          Canvas.CopyRect(Rect(0,0,Width,Height), img.Canvas, Rect4Selection);
    //showmessage(format('%4d %4d %4d %4d', [0,0,Width,Height]));
          //SaveToFile('/chemin/testrect.bmp'); // OK !
          ZoneCopieFaite := True; // traitée dans le timer de la fiche appelante, pour lui rendre la main.
        end;
      end; { if }
      Hide;
    end;
    Regardez bien le commentaire 5 lignes au-dessus de la fin : j'active un timer (sur la mainform) qui attend le boolean pour reprendre la main et traiter le bmp contenant l'image.

    Peut-être qu'il manque des trucs (flemme de vérifier), n'hésitez pas à poser des questions.
    Et la base n'est pas de moi, je l'ai trouvée on the web.

    Citation Envoyé par ChPr Voir le message
    Il faut que cela fonctionne dans les environnements Windows et Linux.
    C'est le cas avec mon bazar.

Discussions similaires

  1. Détecter la position de la souris dans une fonction
    Par polemoss dans le forum jQuery
    Réponses: 5
    Dernier message: 19/03/2009, 09h28
  2. Réponses: 3
    Dernier message: 01/02/2009, 00h05
  3. Réponses: 4
    Dernier message: 06/05/2008, 19h59
  4. Réponses: 7
    Dernier message: 18/01/2007, 15h03
  5. Afficher les élements d'un formulaire dans une autre fenetre
    Par BernardT dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/12/2005, 22h52

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