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

  1. #21
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    OnMouseUp et OnMouseDown dont Jipete parle son les évènement de ton application. Toujours avec mon exemple tu pourrais rajouter un boolean IsInApp:=AppRect.Contains(mp) la variable mp MousePosInApp etc.. sont a mettre dans la partie public de ta form. Ensuite dans les évènements OnMouseXXXX il suffit de faiire un test [c] if IsInApp then [c/] eg de recuperer la position de la souris de la variable "mp" ou le resultats des calculs. A tester
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #22
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Ce que je vviens de dire ne fonctionnera pas. Il ne faut pas passer par OnMouseXXX. Il faut que tu interceptes les "messages" de la souris provenant du systeme. Je ne peux pas te dire comment la, je suis retourné au boulot. Mais en faisant une petite recherche tu devrais trouver des informations.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    ... Il faut que tu interceptes les "messages" de la souris provenant du systeme. Je ne peux pas te dire comment la, je suis retourné au boulot. Mais en faisant une petite recherche tu devrais trouver des informations.
    C'est ce que je cherche à faire depuis le début, mais que je n'arrive pas à trouver. Il faut que cela fonctionne dans les environnements Windows et Linux.

    Cordialement.

    Pierre

  4. #24
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 124
    Points
    15 124
    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.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Jipété Voir le message
    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). ...
    Moi, j'ai trouvé cela sur le WEB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm2.AffCopieEcran;
    var
      bmp: TBGRABitmap;
    begin
      bmp:=TBGRABitmap.Create(Monitor.Width, Monitor.Height);
      bmp.TakeScreenshotOfPrimaryMonitor;
      bmp.Draw(Copie.Canvas, Rect(0, 0, Screen.Width, Screen.Height)); // Copie est un TImage
      bmp.Free;
    end;
    Avec ça, je plante totalement le PC (sous Windows). Si tu retrouves ton code, je suis preneur.

    Cordialement.

    Pierre

  6. #26
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 124
    Points
    15 124
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Si tu retrouves ton code, je suis preneur.

    Cordialement.

    Pierre
    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
    function TfrmContrast.FullDesktopScreenShot(var bmp: TBitmap): Boolean;
    var
      DesktopCanvas: TCanvas;
      ScreenDC: HDC;
      {$IFDEF WINDOWS}
        r: TRect;
      {$ENDIF}
    begin
      Result := False;
      ScreenDC := GetDC(0);
      try
        if (ScreenDC = 0) then Exit;
        with bmp do begin
          DesktopCanvas := TCanvas.Create;
          try
            DesktopCanvas.Handle := ScreenDC;
            {$IFDEF WINDOWS}
              r := Rect(0, 0, Screen.DesktopWidth, Screen.DesktopHeight);
              Canvas.CopyRect(r, DesktopCanvas, r);
            {$ELSE}
              LoadFromDevice(DesktopCanvas.Handle);
            {$ENDIF}
            Result:= True;
          finally
            DesktopCanvas.Free;
          end;
        end; // with bmp
      finally
        if (ScreenDC <> 0) then ReleaseDC(0, ScreenDC);
      end;
    end;
     
    function TfrmContrast.MakeMainScreen(var bmp: TBitmap): boolean;
    begin
      Result := False;
      with bmp do begin
        PixelFormat := pf24bit;
        Width := Screen.DesktopWidth;
        Height:= Screen.DesktopHeight;
        if FullDesktopScreenShot(bmp) then begin
          with unit4image.frm4CopieEcran do begin
            OldCursor := Screen.Cursor;
            Screen.Cursor := crCross;
            img.Canvas.Draw(0,0,bmp); 
            //ok Picture.Bitmap.SaveToFile(ProgramDirectory+FloatToStr(Int(Frac(Now)*100000))+'_Fullimg.bmp');
            Show;
          end;
          Result := True;
        end;
      end;
    end;
     
    procedure TfrmContrast.btn4CaptureClick(Sender: TObject);
    begin
      if ckbxMaskForm.Checked then Application.MainForm.Hide;
      Application.ProcessMessages;
      Sleep(350);
      Application.ProcessMessages;
      if MakeMainScreen(Bmp4FulScreen) then // génère le fond d'écran utilisé pour la sélection
        Wait4User.Enabled := True; // waiting4user : <ENTREE> ou sél. avec souris ou <ECHAPP>
        // passe la main au timer et sa boucle d'attente
    end;
    Enjoy,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #27
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Rebonsoir Pierre, bon c'est un peu le bazar ton sujet. J'ai donc des questions à te poser :

    Ton application tierce doit-elle recevoir les évènements de la souris pour effectuer des opérations ? en gros doit elle avoir le focus ?
    Que fait ton application tierce, par curiosité ?

    Si oui il faudra effectivement intercepter les messages de la souris AVANT de faire une copie d'écran. Sinon la solution à été donnée par JurrasikPork et Jipete pour la capture d'ecran. Et il existe encore un autre moyen de faire, avec une fenêtre transparente et Application.AddOnUserInputHandler mais c'est une autre histoire.
    Sinon pour intercepter les évènement de la souris, il n'existe pas de solution multi-plateforme toute faite. Sous Windows AndNotOr à répondu à la question et tu peux trouver un exemple sur le web : http://lazplanet.blogspot.ch/2016/06...side-your.html
    Pour linux c'est une autre paire de manche les seules informations que j'ai trouvé sont ici https://stackoverflow.com/questions/...ouse-movements et c'est pour envoyer des évènements, mais pour ça, Lazarus dispose du paquet LazMouseAndKeyInput Donc sous linux il faudrait donc essayé de passer les "XEvent" pour intercepter les messages de la souris, mais ce n'est pas trop mon truc de jouer avec ces instructions. Mais cela doit être possible.

    J'ai également trouvé cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function CheckMouseButtonDownUp(const AWinHandle: THandle; const AWinControl: TWinControl;
      var LastMouse: TLastMouseInfo; const AMousePos: TPoint; const AButton: Byte;
      const AMouseDown: Boolean): Cardinal;
    dans l'unité controls. Mais là encore je n'ai aucune idées de comment récupérer le THandle d'une application sous Linux. Cette fonction pourrais être la solution la moins couteuse en temps. Mais la question est maintenant de comment récupérer le Handle de ton application tierce sous Linux ? sous Windows je sais qu'il existe plusieurs solutions. notamment en utilisant les "WMI" et en récupérant les processus actif par exemples.

    Sinon autre solution (peut-être) c'est de faire l'inverse au lieux d'intercepter les messages c'est de les envoyer vers ton applications tierce gràce à l'unité LazMouseAndKeyInput et mon autre histoire avec Application.AddOnUserInputHandler et une fenêtre transparente.
    Ca pourrais peut-être marcher. Il faudrait tester.

    Voilà j'ai pas trouvé mieux. Tu pourrais peut-être aussi essayé de poster un message sur le forum de freepascal directement.

    Bonne fin de soirée
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #28
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 124
    Points
    15 124
    Par défaut
    Salut,
    Citation Envoyé par BeanzMaster Voir le message
    Et il existe encore un autre moyen de faire, avec une fenêtre transparente et Application.AddOnUserInputHandler mais c'est une autre histoire.
    Sous Linux, selon l'environnement, la transparence n'existe pas...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #29
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    ...Ton application tierce doit-elle recevoir les évènements de la souris pour effectuer des opérations ? en gros doit elle avoir le focus ?
    Que fait ton application tierce, par curiosité ? ...
    Pour être précis, L'application tierce est un site internet présentant des cartes géographiques que l'on peut déplacer avec la souris. Par exemple, si je place ma souris sur la droite de l'écran, que j'appuie sur la touche gauche de la souris et que je déplace celle-ci vers la gauche de l'écran, la carte défile jusqu'à ce que je relâche la touche de la souris. J'ai alors à l'écran une partie plus à l'est.

    Le but de mon application est de rabouter ces images pour un faire une seule image que j'exploite par ailleurs.

    Donc, comme je le disais, seul le déplacement de la souris m'intéresse entre l''appui et le relâchement (la solution avec le timer me convient). A l'issue du relâchement je souhaite faire une copie de l'écran dont je ne garderai qu'une partie fonction du déplacement relevé.

    Je considère donc acquis la détection du déplacement de la souris.

    Reste le problème de la copie de l'écran qui avec la solution que j'ai trouvée plante mon PC.

    Cordialement.

    Pierre

  10. #30
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 124
    Points
    15 124
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Reste le problème de la copie de l'écran qui avec la solution que j'ai trouvée plante mon PC.
    Aurais-tu zappé mon post de 22 h 28 ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #31
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Aurais-tu zappé mon post de 22 h 28[/URL] ?
    Non, je suis en train d'essayer de le mettre en œuvre sans succès.

    Dans ton code :

    ligne 41 : Qu'est ce que "unit4image.frm4CopieEcran" ? Le TForm sur lequel j'ai mon TImage destiné à recevoir la copie d'écran.
    ligne 44 : Qu'est-ce que "img" ?
    ligne 59 : Qu'est-ce que "Bmp4FulScreen" ? Quel est le lien entre bmp et mon TImage ?

    Cordialement.

    Pierre

  12. #32
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par Jipété Voir le message
    Salut,


    Sous Linux, selon l'environnement, la transparence n'existe pas...
    Ah ! oui j'avais oublié ce détail en plus

    Citation Envoyé par ChPr Voir le message
    Pour être précis, L'application tierce est un site internet présentant des cartes géographiques que l'on peut déplacer avec la souris. Par exemple, si je place ma souris sur la droite de l'écran, que j'appuie sur la touche gauche de la souris et que je déplace celle-ci vers la gauche de l'écran, la carte défile jusqu'à ce que je relâche la touche de la souris. J'ai alors à l'écran une partie plus à l'est.

    Le but de mon application est de rabouter ces images pour un faire une seule image que j'exploite par ailleurs.

    Donc, comme je le disais, seul le déplacement de la souris m'intéresse entre l''appui et le relâchement (la solution avec le timer me convient). A l'issue du relâchement je souhaite faire une copie de l'écran dont je ne garderai qu'une partie fonction du déplacement relevé.

    Je considère donc acquis la détection du déplacement de la souris.
    Ok je comprend mieux maintenant

    Hum, comment faire ?
    La solution qui me vient à l'esprit serait d'utiliser les composants : HTLMViewer + Indy, tous les 2 disponibles avec Online Package Manager. Ceux-ci te permettront d'ouvrir ton site web dans une "form" secondaire ou dans la fenêtre principale de ton application assez facilement. De là, récupérer les informations de la souris et faire une copie d'écran deviendra beaucoup plus facile.

    Citation Envoyé par ChPr Voir le message
    Reste le problème de la copie de l'écran qui avec la solution que j'ai trouvée plante mon PC.
    La fonction la plus simple et qui devrait fonctionner aussi bien sous Linux que sous Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function GetScreenshot: TBitmap;
    var
      screenDC: HDC;
    begin
      screenDC:=GetDC(0);
      try
        Result:=TBitmap.Create;
        Result.LoadFromDevice(screenDC);
      finally
        ReleaseDC(0, screenDC);
      end;
    end;
    pour faire une capture d'une "form"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TForm1.TakeFormScreenShot:TBitmap;
    begin
      Result := Self.GetFormImage;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #33
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 124
    Points
    15 124
    Par défaut
    Hé bien, comme leurs noms l'indiquent,

    Citation Envoyé par ChPr Voir le message
    Dans ton code :

    ligne 41 : Qu'est ce que "unit4image.frm4CopieEcran" ? Le TForm sur lequel j'ai mon TImage destiné à recevoir la copie d'écran.
    Oui.
    Appelé depuis la fiche principale.

    Citation Envoyé par ChPr Voir le message
    ligne 44 : Qu'est-ce que "img" ?
    un TImage posé sur la fiche qui fait la copie (voir rép. ci-dessus) aligné en alClient, la fiche étant maximisée, et qui va recevoir la capture du Bureau, plus qu'à déplacer la souris dessus,

    Citation Envoyé par ChPr Voir le message
    ligne 59 : Qu'est-ce que "Bmp4FulScreen" ? Quel est le lien entre bmp et mon TImage ?
    un Bmp utilisé pour être rempli avec la copie d'écran faite en mode FullScreen (et j'ai enlevé une lettre "l [à l'oreille, elle ou aile, au choix]" pour un simple désir d'alignement car j'ai d'autres Bmp avec des noms précis également, et j'aime bien quand les choses sont alignées, je trouve ça plus lisible).
    Quant au lien avec ton TImage, je ne sais pas, ne sachant pas trop ce qu'il fait.

    Pi dans mes noms, en général je remplace bien souvent "pour" par "4". Pourquoi ? Parce qu'à l'oreille (encore !), "4" ça sonne un peu comme "foeur", qui peut être assimilé à "for", "pour", hé hé hé.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #34
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Je vous remercie tous pour la participation très active à résoudre mon problème qui, même si dès le début j'ai demandé ce que je voulais, des précisions étaient nécessaires pour mieux cerner le problème.

    Lors de la copie d'écran, j'ai dit que mon PC se bloquait. En fait, je me suis fait avoir car, ayant choisi une fenêtre sans bords et de dimension de l'écran, lorsque je copiais l'écran ... ben rien ne changeait visuellement. Mais ma souris, sur cette image n'avait aucune action (j'avais quand même installé un double-click pour en sortir) et c'est pour cela que je croyais mon programme planté.

    Au final, je me sers d'un timer pour gérer la souris et pour la copie d'écran, la solution "GetScreenShot" (à laquelle il manque un BitMap.Free) de "BeanzMaster" qui est une solution simplifiée de ce que "jipété" a proposé.

    J'ai testé avec succès ces deux fonctionnalités dans les environnements Windows et Linux.

    Je reviendrai certainement vers vous pour des questions de TImage, TPicture, TCanvas,et TBitmap qui, bien qu'à une époque j'avais réalisé un traitement d'image complet, a toujours été d'un confusion pas possible dans ma tête.

    Encore une fois merci à tous.

    Cordialement.

    Pierre

  15. #35
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je vous remercie tous pour la participation très active à résoudre mon problème qui, même si dès le début j'ai demandé ce que je voulais, des précisions étaient nécessaires pour mieux cerner le problème.

    Lors de la copie d'écran, j'ai dit que mon PC se bloquait. En fait, je me suis fait avoir car, ayant choisi une fenêtre sans bords et de dimension de l'écran, lorsque je copiais l'écran ... ben rien ne changeait visuellement. Mais ma souris, sur cette image n'avait aucune action (j'avais quand même installé un double-click pour en sortir) et c'est pour cela que je croyais mon programme planté.

    Au final, je me sers d'un timer pour gérer la souris et pour la copie d'écran, la solution "GetScreenShot" (à laquelle il manque un BitMap.Free) de "BeanzMaster" qui est une solution simplifiée de ce que "jipété" a proposé.

    J'ai testé avec succès ces deux fonctionnalités dans les environnements Windows et Linux.

    Je reviendrai certainement vers vous pour des questions de TImage, TPicture, TCanvas,et TBitmap qui, bien qu'à une époque j'avais réalisé un traitement d'image complet, a toujours été d'un confusion pas possible dans ma tête.

    Encore une fois merci à tous.

    Cordialement.

    Pierre
    Pas de soucis et non, il ne manque pas Bitmap.Free dans la fonction, c'est à toi de libérer ton objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Var
    Capture : TBitmap;
     
    Capture := GetScreenShot;
    ....
    Capture.Free
    Donc du coup, si c'est pigé tu bouges ta carte sur le site web et tu fais une simple capture toutes les secondes, ou tu lances ta capture lorsque tu as finis ?

    A+

    EDIT : Très intéressant ton logiciel de traitement d'image
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  16. #36
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    ... Donc du coup, si c'est pigé tu bouges ta carte sur le site web et tu fais une simple capture toutes les secondes, ou tu lances ta capture lorsque tu as finis ? ...
    Le principe d'utilisation est le suivant :

    • J'appuie sur la touche gauche de la souris,
    • Je déplace la souris, ce qui déplace la carte,
    • je relâche la touche gauche apès le déplacement voulu,
    • J'attends que l'image délivrée par le serveur soit bien rafraichie,
    • Je fais alors la copie d'écran en ne conservant que la partie utile (liée au déplacement).

    Cordialement.

    Pierre

  17. #37
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Le principe d'utilisation est le suivant :
    ...
    Je fais alors la copie d'écran en ne conservant que la partie utile (liée au déplacement).

    Cordialement.

    Pierre
    Ok mais comment fait tu pour récupérer ce déplacement et seulement cette partie utile ? car tu peux détecter les boutons que si ta souris est sur ta Form, tu appuie sur une touche et tu met un "Flag" sur TRUE ? j'ai du rater quelque chose sur ce coup. Comment fais tu pour récupérer seulement la partie qui t'intéresse ?
    Tu re-sélectionne un rectangle sur la copie d'écran en manuelle ? Si ta carte fait disons 300 pixel que tu la déplace de la même longueur, je pige, mais si tu déplace seulement de 10 pixels. Cette bande de 10 pixels tu la récupère de quelle façon ? Il me manque un épisode.

    Merci

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  18. #38
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello
    Citation Envoyé par ChPr Voir le message
    Pour être précis, L'application tierce est un site internet présentant des cartes géographiques que l'on peut déplacer avec la souris.
    je ne sais pas quel est ton site et quels types de cartes géographiques, il présente, mais pour certains types de cartes, il existe un package (mapviewer) lazarus pour visualiser et gérer des cartes en ligne (zoom, déplacement, coordonnées etc ...) :
    openstreetmap mapnik, Virtual Earth Aerial, Virtual Earth Bing, Virtual Earth hybrid etc ...

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  19. #39
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Ok mais comment fait tu pour récupérer ce déplacement et seulement cette partie utile ? car tu peux détecter les boutons que si ta souris est sur ta Form, tu appuie sur une touche et tu met un "Flag" sur TRUE ? j'ai du rater quelque chose sur ce coup. Comment fais tu pour récupérer seulement la partie qui t'intéresse ?
    Tu re-sélectionne un rectangle sur la copie d'écran en manuelle ? Si ta carte fait disons 300 pixel que tu la déplace de la même longueur, je pige, mais si tu déplace seulement de 10 pixels. Cette bande de 10 pixels tu la récupère de quelle façon ? Il me manque un épisode.

    Merci

    Jérôme
    Essaie ça :

    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
      TForm1 = class(TForm)
         Infos: TStatusBar;
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
      private
        { private declarations }
        Appuye: Boolean;
        PosD, PosA: TPoint;
      public
        { public declarations }
       end;
     
    function GetCursorState: TShiftState;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    function GetCursorState: TShiftState;
    begin
      Result := [];
      if (GetKeyState(VK_LBUTTON) and $8000) <> 0 then
        Include(Result, ssLeft);
      if (GetKeyState(VK_MBUTTON) and $8000) <> 0 then
        Include(Result, ssMiddle);
      if (GetKeyState(VK_RBUTTON) and $8000) <> 0 then
        Include(Result, ssRight);
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      PosC: TPoint;
      State: TShiftState;
    begin
      GetCursorPos(PosC); // retrouve la position de la souris
      State:= GetCursorState; // retroue l'état des touche de la souris
      if not Appuye and (ssLeft in State) then
      begin
        Infos.Panels[2].Text:= 'DOWN';
        Appuye:= True;
        PosD:= PosC;
        end
      else
      if Appuye and not(ssLeft in State) then
      begin
        Infos.Panels[2].Text:= 'UP';
        Appuye:= False;
        PosA:= PosC;
        if not Application.Active then
        begin
          Infos.Panels[0].Text:= IntToStr(PosD.x-PosA.x);
          Infos.Panels[1].Text:= IntToStr(PosD.y-PosA.y);
        end;
      end;
    end;
     
    end.
    Dans une Form dans laquelle tu as mis un Timer et un TStatusBar avec 3 cases.
    • Tu rends le timer valide et avec un intervalle de qq mS.
    • Tu lances le programme,
    • tu ouvres ton navigateur sur n'importe quoi (pour l'instant) qui devient en premier plan
    • Tu appuies sur la touche gauche de la souris quelque part, tu déplaces et tu relèves la touche ailleurs.
    • Tu fais revenir ton appli en premier plan et tu regardes dans ton statusBar, tu verras les déplacements en X et Y liés à ce que tu as imprimé à la souris.

    Après, pour récupérer la partie qui m'intéresse, j'utilise ta fonction GetScreenShot et j'en découpe la partie qui m'intéresse, elle est liée à la taille de l'écran et au déplacement de la souris. C'est de la magouille algébrique

    Cordialement.

    Pierre

  20. #40
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    ... il existe un package (mapviewer) lazarus pour visualiser et gérer des cartes en ligne (zoom, déplacement, coordonnées etc ...) : ...
    Je ne connaissais pas. Mais en essayant de le télécharger, voici ce que j'obtiens :

    401: Anonymous caller does not have storage.objects.get access to google-code-archive/v2/code.google.com/mapviewer/downloads-page-1.json.
    Je ne suis pas un spécialiste des téléchargements à tiroir. J'essaierai de savoir comment faire.

    NOta : les sites que je recherche ne sont pas gérés pas ce composant

    Cordialement.

    Pierre

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