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

Delphi Discussion :

SendMessage 'tombe' sur une image


Sujet :

Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Par défaut SendMessage 'tombe' sur une image
    Bonjour à tous,
    Voici mon pb, je veux simuler l'action de la souris sur un logiciel afin de l'automatiser. J'ai trouvé sur Developpez.com ce code que j'ai appliqué :
    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
     
    procedure Tform1.my_beautifull_prog;
     
    var
    hCible, hButton : HWND;
     
    begin
    winexec(pchar('C:\my_beautifull_prog.exe'),sw_show);
       application.ProcessMessages;
       sleep(2000);
     
    hCible := FindWindow(nil, PChar('my_beautifull_prog')); //on retrouve le Handle de la fenêtre du programme
    if hCible <> 0 then
    begin
    hButton := FindWindowEx(hCible, 0, nil, PChar('OK')); //on retrouve le Handle du bouton sur lequel on veux cliquer
    if hButton <> 0 then
    SendMessage(hButton, BM_CLICK, 0, 0); //on ( veut !) lui faire croire que l'on a cliqué dessus
     
    end;
    Le problème est que ce n'est pas un Button, c'est, d'après WinID ( logiciel comme Spy++), une image (le bouton !). Et bien sûr ça ne fonctionne pas !
    En fait, le prog se lance, reconnaît la fenêtre, le bouton (image) apparaît et rien ne se passe: pas de clic simulé !
    Comment faire ? Remplacer hbutton par quoi ? Ce hbutton n'est qu'un HWND, une image a-t-elle un HWND ? Que faire ?
    Tout ça sous XP PRO, Millenium et avec ce cher Delphi 6 Perso ( ben oui !)

    Merci pour vos réponses.
    Phil

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 554
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 554
    Par défaut
    Citation Envoyé par systeme1
    En fait, le prog se lance, reconnaît la fenêtre, le bouton (image) apparaît et rien ne se passe: pas de clic simulé !
    Comment faire ? Remplacer hbutton par quoi ? Ce hbutton n'est qu'un HWND, une image a-t-elle un HWND ? Que faire ?
    Phil
    Une image bitmap ? C'est un TGlpyhButton ?
    Sinon que vaut hButton en déboguage ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Par défaut sendmessage???
    hbutton vaut 0 vu le code !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if hButton <> 0 then
    begin
    sendMessage(hButton, BM_CLICK, 0, 0); //on lui faire croire que l'on a cliqué dessus
    end;
    par contre je ne sais comment récupérer la valeur du HWND

  4. #4
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Bonjour,

    Essai avec la caption de la fiche du prog

    example avec la calculatrice windows:

    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
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
    hCible, hButton : HWND;
     
    begin
      hCible := FindWindow(nil, 'Calculatrice'); 
      if hCible <> 0 then
      begin
        hButton := FindWindowEx(hCible, 0, nil, '7'); 
        if hButton <> 0 then
          SendMessage(hButton, BM_CLICK, 0, 0);
      end;
    end;
    et hop un 7 apparait dans la calculatrice windows

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Par défaut
    Super le 7 dans la calculatrice mais ça ne résoud pas mon pb.
    Le clic sur le bouton 'OK' reste sans effet !

  6. #6
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    si ca marche pour la calculatrice ca doit marcher pour ton programme.
    c'est quoi ton programme?

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 554
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 554
    Par défaut
    Citation Envoyé par systeme1
    Super le 7 dans la calculatrice mais ça ne résoud pas mon pb.
    Le clic sur le bouton 'OK' reste sans effet !
    j'ai posé une question bien précise : tu as parlé d'image ?
    Si tu ne réponds pas avec précision et que tu zappes les réponses données on ne peut pas te répondre.
    Cela ne fonctionne pas parce que le bouton sur lequel tu tentes d'envoyer un message système est personnalisé ou bien un ensemble de plusieurs contrôles à la fois...

    Je prends Spy++ je capture le bouton 7 de la calculatrice : class ="button" handle =00030240 Text="7"

    Je capture Firefox class="MozillaWindowClass"
    Comment je fais pour envoyer avec SendMessage un message à MozillaWindowClass ??

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Par défaut réponse tardive
    Rebonjour, je n'ai pas eu trop le temps depuis dimanche mais je réponds à ta question ... le boulot ... ça bouffe le temps !!!!:
    Class : TACImage
    Title ""
    HWND :0xC02EC
    C'est tout ce que je vois de révélateur avec WinID (like Spy++)

    C'est pas TButton c'est une TACImage
    Si ça peut t'ais=der à me répondre... Merci d'avance et mes excuses pour ma réponse très en retard
    Phil

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Il est possible que le TACImage ne réponde pas au message BM_CLICK.
    As-tu essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if hButton <> 0 then
    begin
      SendMessage(hButton,WM_LBUTTONDOWN,0,0);
      SendMessage(hButton,WM_LBUTTONUP,0,0);
    end;
    Si ça ne fonctionne pas non plus, il reste la possibilité de simuler un clic comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if hButton <> 0 then
    begin
      Windows.GetWindowRect(hButton,aRec);
      SetCursorPos(aRec.Left + 1,aRec.top + 1) ;
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    end;
    Le problème de cette solution c'est que la fenêtre doit obligatoirement être au premier plan et que la souris est déplacée !
    Bon courage !
    Eb.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Par défaut
    Merci pour ta réponse,
    Je vais essayer ta 1ere solution car la 2eme je m'en servais déjà, je voulais l'éviter et donc en changer avec le SendMessage. Mais bon...
    Je te tiens au courant
    Merci Phil

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Par défaut
    Bonjour,
    Bon j'ai essayé ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if hButton <> 0 then
    begin
      SendMessage(hButton,WM_LBUTTONDOWN,0,0);
      SendMessage(hButton,WM_LBUTTONUP,0,0);
    end;
    Mais ça ne marche pas.
    Je me demande si on peut envoyer un sendmessage a ce TACImage ?
    Simuler le curseur marche mais je veux l'éviter pour des raisons de pratique.
    Merci.
    Tous vos idées sont les bienvenues.
    Phil

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Tu peux utiliser un outils qui te permettra de catcher les messages reçus par ton TAcImage (comme Winspector) afin de déterminer s'il répond à des messages souris. A part ça, je n'ai plus d'idée ...
    Bon courage
    Eb.

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    On peut imaginer que le click est traité par la fenetre principale
    étant donnée que le bouton est seulement une image?
    essaie d'envoyer un left-click au programme principale...mais aux
    coordonées du bouton...

    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
     
    var
    hCible, hButton : HWND;
    aRec:TRect;
    Msg: TMessage;
    Pt : TPoint;
     
    begin
      //== Trouve le main hWnd ==
      hCible := FindWindow(nil, 'my_beautifull_prog');
      if hCible <> 0 then
      begin
        //== Trouve le bouton OK... ==
        hButton := FindWindowEx(hCible, 0, nil, 'OK');
        if hButton<>0 then
        begin
          //== Trouve la position du bouton OK ==
          Windows.GetWindowRect(hButton,aRec);
          Pt := Point(aRec.Left + 1,aRec.Top + 1);
          //== Convertion en coordonnées local de la fenetre ==
          windows.ScreenToClient(hCible, Pt); //? a tester avec ou sans?
          Msg.WParamLo:=Pt.x;
          Msg.WParamHi:=Pt.y;
          //== Envoi un Left-Click message ==
          //== au Main hWnd à la position du bouton.... ==
          sendMessage( hCible,WM_LBUTTONDOWN,0,Msg.WParam );
          sendMessage( hCible,WM_LBUTTONUP,0,Msg.WParam );
        end;
      end;
    end;
    C'est juste une idée comme ça...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  14. #14
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,
    Pour ton problème je te propose de changer carrément de stratégie.

    puisque tu peux pas envoyer de message au bouton (enfin image) je te propose de simuler le click en collant la souris dessus

    voici le code: l'application se resume a une form et un bouton
    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
     
    procedure TForm1.btn1Click(Sender: TObject);
    var
      fenetre : HWND;
    begin
      fenetre := FindWindow(nil, 'Le caption du beautiful prog');
     
      //on minimize l'appli en cours
      Application.Minimize;
     
     
      if fenetre <> 0 then
      begin
        //on position la fenetre (du beautiful prog) au bord gauche en haut du bureau 
        SetWindowPos(fenetre, 0, 0, 0, 0, 0, 0);
        //on l'affiche (la fenetre du beautiful prog) si elle est minimisée
        ShowWindow(fenetre, SW_NORMAL);
     
        //on colle le curseur sur l'image 
        SetCursorPos(85, 150);
        //et on simule un clique gauche
        Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
        Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
      end;
    end;
    voila a partir de la tu peux imaginer un systeme de script que tu pourra enregistrer et sauvegarder dans des fichiers (sorte de macro quoi !)

  15. #15
    Membre habitué
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut Sos
    desolé je sais que ce n'es pas le theme mais j'ai besoin d'aide d'urgence, comment ouvrir le diagrame de sequence avec rational rose
    nafiassou@yahoo.fr

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/11/2007, 13h31
  2. aide sur une image
    Par laetus dans le forum IHM
    Réponses: 5
    Dernier message: 04/10/2004, 15h54
  3. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 18h11
  4. Zoom sur une image
    Par AurelBUD dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/05/2004, 18h05
  5. Comment mettre un label sur une image
    Par dug dans le forum MFC
    Réponses: 3
    Dernier message: 07/04/2004, 11h40

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