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

C++Builder Discussion :

Cliquer sur un bouton dans une autre application


Sujet :

C++Builder

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut Cliquer sur un bouton dans une autre application
    Bonjour,

    Est-il possible a partir de mon application de simuler un click de souris sur un bouton d'une autre application ?

    Si oui, auriez-vous un exemple SVP ?

    Merci d'avance
    Fred

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    D'après moi ceci devrait fonctionné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(hParent, WM_COMMAND, MAKELONG(ID_de_ton_control, BN_CLICKED), (LPARAM)hButton);
    Bien sûr il faut trouver les bonnes infos sur le bouton.

    Pour plus d'info sur le message BN_CLICKED:
    http://msdn.microsoft.com/en-us/library/aa452896.aspx

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Si c'est simuler un click sur un bouton d'une application totalement independante de celle que tu utilise c'est possible, mais il te faut recuperer les Handles de la Form, et des divers elements, jusqu'au boutton

  4. #4
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Tiens voici une solution plus complète que j'ai volé sur Experts Exchange

    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
          //------------ 1er - trouvé la fenêtre ------------//
     
          HWND hDlg = FindWindowEx(NULL, NULL, m_lpszClass, (LPCTSTR)m_strWindowText);
     
          //------------ 2e - trouvé et cliqué sur le bouton ------------//
     
          if (hDlg)      
          {
                HWND hControl = 0;
                hControl = GetDlgItem(hDlg, m_nControlID);
     
                if ( PostMessage(hDlg, WM_COMMAND, (WPARAM)((BN_CLICKED*0x10000)+m_nControlID), (LPARAM)hControl) )
                      if ( ! m_bLurk)      
                            return true;
          }
    Pour trouvé certaine information tu dois utilisé un programme comme WinSpy++.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    je connaissais pas ton tool sinon pour recuperer id handle
    il y a aussi un super outil dispo à l install d autoIt : Au3Info.exe

    http://www.autoitscript.com/autoit3/

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Merci pour vos reponses, je vais essayer...
    Juste encore une petite question:
    Si je ne me trompe pas , l'ID de mon control (button) change a chaque nouvelle execution de l'application ? Comment je peux faire car dans vos exemples on a besoin d'un ID pour le control ?

    cedni, je suis alle voir Au3Info.exe, et ca a l'air pas mal du tout ce soft, mais je voudrais essayer de le faire moi meme dans mon application. Si vraiment je n'y arrive pas, alors je me rabattrais sur Au3Info.exe.

    Merci
    Fred

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Il faut pour recuperer le Handle d'une Form utiliser comme la dit Crayon un utilitaire comme WinSpy++ qui va te lister touts les programmes en cour, ca te permet de recuperer le nom de la fenetre, et son Handle

  8. #8
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Normalement la variable m_nControlID ne devrais pas changer si c'est toujours le même bouton. Avec WinSpy++ sélectionne le bouton et regarde la valeur à côté de Control ID.

    Les seuls valeurs qui changent sont les valeurs défini par HWND.

    Pour remplir la variable m_lpszClass il faut sélectionné la fenêtre complète de ton application et regarder la valeur à Class. Par exemple, avec Firefox on obtient MozillaUIWindowClass. Et on rempli m_strWindowText avec le texte qui est dans Caption.

    Pour plus d'info sur FindWindowEx va voir:
    http://msdn.microsoft.com/en-us/libr...00(VS.85).aspx

  9. #9
    Membre actif Avatar de Bily.sdi
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 208
    Points : 206
    Points
    206
    Par défaut
    char buf[300];
    HWND code;

    // récupéré le handle d'un objet se trouvant en dessous de la souris
    code = WindowFromPoint(mouse->CursorPos);

    // lecture du nom de l'objet en dessous de la souris
    GetWindowText(code,buf,300);

    met ce code dans un timer et place 1 liste sur ta form.
    passe la souris sur les bouton edit etc.. des fenêtres et tu verra
    ta liste se remplir.

    tu peux même modifier les autres application.

    SetWindowText(code,"coucou");


    pour faire une farce a qqn g mélanger et effacer certains bouton de la calculatrice de windows

    @+

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut,

    J'ai reussi a faire ceci pour un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    HWND Handle = GetWindow(hParent ,GW_CHILD);
    PCHAR Titre = StrAlloc(256);
    GetClassName(Handle, lpRes, sizeof(lpRes));
    if ((AnsiString)lpRes == "TButton") {
      GetWindowText(Handle, lpRes,256);
      int ID = GetDlgCtrlID(Handle);
      SendMessage(hParent, WM_COMMAND, MAKELONG(ID, BN_CLICKED), (LPARAM)Handle);
     }
    Ce code fonctionne bien, mais ca se complique car je croyais que c'etait sur un bouton que je devais simuler le click, mais en fait c'est sur un bouton d'une TToolBar.
    Donc quelle est la fonction permettant d'envoyer via SendMessage pour simuler le click d'un bouton sur la TToolBar ?

    Merci

  11. #11
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Normalement la même façon devrait fonctionner (avec un BN_CLICKED).

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    J'ai essaye, mais cela ne fait rien.

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    J'ai essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int iNb = SendMessage(Handle, TB_BUTTONCOUNT,0,0);
      int nIDCommand = -1;
      TBBUTTON pTBBtn;
      memset(&pTBBtn,0,sizeof(TBBUTTON));
      for (int i = 0; i < iNb; i++) {
       SendMessage(Handle, TB_GETBUTTON, (WPARAM) i, (LPARAM)&pTBBtn);
       nIDCommand = pTBBtn.idCommand;
       SendMessage(Handle, TB_PRESSBUTTON, nIDCommand, MAKELPARAM(1, 0));
      }
    Il trouve bien tout mes boutons de la ToolBar, mais par contre pour chaque bouton, pTBBtn contient toujours 0. Donc je n'ai pas de idCommand.
    Peut-etre que j'ai oublie quelque chose ?

  14. #14
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut Voici la réponse
    J'ai trouvé comment faire sur ce site:
    http://blog.csdn.net/seu07201213/arc...07/891274.aspx

    Voici mon code que j'ai tester en C sous Visual C++:

    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
    HWND Handle = (HWND)0x02550C86;
    HANDLE hProcess;
    int iNb;
    int nIDCommand = -1;
    unsigned long n = 0;
    TBBUTTON *pButton;
    DWORD pid = 0;
     
    pButton = (TBBUTTON *)malloc(sizeof(TBBUTTON));
    GetWindowThreadProcessId(Handle, &pid);
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_ALL_ACCESS, 1, pid);
     
    iNb = SendMessage(Handle, TB_BUTTONCOUNT, 0, 0);
    for (int i = 0; i < iNb; i++)
    {
        TBBUTTON pTBBtn = { 0 };
        SendMessage(Handle, TB_GETBUTTON, (WPARAM)i, (LONG)(LPARAM)&pTBBtn);
        ReadProcessMemory(hProcess, &pTBBtn, pButton, sizeof(TBBUTTON), &n);   
        nIDCommand = pButton->idCommand;
        SendMessage(GetParent(Handle), WM_COMMAND, MAKELONG(nIDCommand, BN_CLICKED), (LPARAM)Handle);
    }
    free(pButton);
    J'ai harcoder mon Handle pour fin de test.

    Tu peux utiliser new/delete si tu veux. Étant donné que j'étais en C...

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Merci Crayon.
    J'ai essaye ton code, et ca marche.
    Par contre ce qui est bizarre, c'est que ca ne marche pas pour toutes les toolbars. Sur certaines fenetres ca ne marche pas.
    D'ailleurs avec mon exemple fait avec builder ( 1 TForm + 1 TToolBar avec 2 buttons) ca ne marche pas.
    Vraiment etrange.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    je cherche à faire un bot qui serait capable de remplir un formulaire et forcément j'ai besoin de pouvoir interragir sur une autre application. voila donc pourquoi je suis sur ce topic car c'est bien ce genre de méthode dont j'ai besoin.

    cependant, je ne suis suis pas tres doué dans ce domaine.. disons que j'ai essayé d'implémenter vos exemples mais j'ai plusieurs erreurs.

    Je développe avec Borland Developper Studio 6 (C++ Builder) et j'ai copié vos codes dans un bouton mais la plupart des *trucs genre 'hParent' etc ne sont soit disant pas définis.... faut-il importer des bibliotheques ?

    comment le bot sait-il sur quelle fenetre il faut cliquer ? il faut que toutes les autres soit fermées ?

    à la limite, serait-il possible d'avoir le code source de WinSpy++ ?

    tant de questions... lol

    bon je continue mes tests en attendant vos réponses merci ++

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Salut Blako_17,

    Non pas besoin de bibliotheques.
    hParent correspond au HWND parent (ma form principale).

    Pour le code source de WinSpy, je crois que ca se trouve a cette adresse : http://www.catch22.net/source/

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/04/2015, 15h23
  2. Réponses: 6
    Dernier message: 08/03/2014, 22h38
  3. Réponses: 4
    Dernier message: 08/10/2010, 14h59
  4. [AC-2000] cliquer sur un bouton d'une autre appli par code
    Par noemieze dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/12/2009, 12h05
  5. Intercepter l'action sur un bouton dans une autre vue
    Par Hira. dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 17/12/2008, 09h51

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