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++ Discussion :

interaction avec d'autres programmes


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut interaction avec d'autres programmes
    Bonjour,
    J'aimerai pour m'amuser, réaliser un petit programme qui fasse des actions pour moi (lancer des sites prés défini, me connecter à msn...etc). Mais je ne sais pas comment ouvrir un programme ou une page web précise et surtout comment naviguer dedans. Si quelqu'un pouvait me dire comment ouvrir un programme et naviguer dedans en simulant des pressions de touche, et est il possible d'envoyer à d'autre programme des strings ou autres variables (genre dans le champ "mot de passe" de msn) ?
    Merci
    interaction

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca va dépendre du système.
    Ensuite la démarche, c'est lancer les processus correspondants aux programmes qu'on souhaite et envoyer/simuler des évènements clavier/souris pour le programme visé.

    Pour linux, ca se fera à grand coup de exec et ses diverses encapsulations puis avec la Xlib
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je suis sous Window, si tu peux m'en dire plus s'il te plait. : )

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Il faut avoir des connaissances de base en API Windows. Il y a des fonctions pour chaque chose que tu veux faire dans le système. Par exemple :

    - Ouvrir un programme : CreateProcess ou ShellExecute
    - Simuler la frappe d'une touche du clavier : keybd_event ou SendInput

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je ne veux pas abuser, mais peux tu s'il te plait, me faire un petit code, qui ouvre un programme (genre blocnote) et y écrit une lettre. Juste pour bien voir s'il te plait, car j'ai fait quelque trucs et ça ne marche pas (le programme se lance mais n'écrit rien dans la fenêtre).
    Est il possible de remettre une application déjà ouverte au premier plan pour s'en servir ?

  6. #6
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,

    Tu trouveras des exemples dans la FAQ, à cette adresse.

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Alors voici un programme qui lance le bloc-notes et y écrit 10 lignes blanches.
    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
    #include <iostream>
    #include <windows.h>
     
    int main()
    {
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi;
        si.wShowWindow = SW_SHOW; // Pour dire qu'on veut rendre l'application visible
     
        BOOL success = CreateProcess("c:\\windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); // Lancement de notepad
        if (success)
        {
            WaitForInputIdle(pi.hProcess, INFINITE); // Attendre que l'application soit prête à recevoir des commandes
     
            for(int i = 0; i < 10; i++)
            {
                keybd_event(VK_RETURN, 0, 0, 0); // Appuyer sur la touche ENTREE
                keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); // Relâcher la touche ENTREE
            }
     
            CloseHandle(pi.hProcess); // Fermer le handle vers le processus
            CloseHandle(pi.hThread);  // Fermer le handle vers le thread principal du processus
        }
        else
            std::cout << "CreateProcess a echoue." << std::endl;
     
        return 0;
    }
    La liste complète des codes de touche se trouve ici.

    Citation Envoyé par Magicflottant
    Est il possible de remettre une application déjà ouverte au premier plan pour s'en servir ?
    Windows propose de nombreuses fonctions pour organiser ou connaître l'organisation actuelle des fenêtres. Quelques exemples :

    - SetActiveWindow : permet, lorsque ta fenêtre est au premier plan, de choisir une autre fenêtre pour la remplacer.

    - GetNextWindow : utilisable pour connaître la fenêtre qui se trouve derrière une autre par rapport à l'axe z de l'écran (l'axe perpendiculaire à l'écran).

    - FindWindow : permet de trouver une fenêtre dont on connaît la classe et/ou le nom.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup
    Par contre je ne comprends pas cette ligne (Je veux faire un programme console (j'adore la console)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si.wShowWindow = SW_SHOW;
    Elle sert à quoi exactement ?

    Et les deux avant ? (je préféré bien comprendre chaque ligne que de bêtement recopier ce qu'on me donne ^^).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    STARTUPINFO si = {0};
        PROCESS_INFORMATION pi;
    Par contre pour une page web ? Il y a une solution "simple" ou je dois ouvrir mon navigateur et taper l'url du site ?

    Peux tu m'en dire plus sur la technique de changement de fenêtre, car j'ai testé: SetActiveWindow(FindWindow(0, "Steam")); ça compile mais rien ne se passe... D:

    Autre petite question, y a t il une fonction "ecrirePhrase" ou je ne sais quoi, qui envois directement une phrase tapé en string ou autre ? Que je ne commence pas une "énorme" (c'est relatif on dira) fonction qui grâce à une boucle convertisse les caractères de mes strings en commande clavier ?

    Encore une petite (désolé je demander autant de chose), j'ai essayé de simuler les touches droite gauche en boucle pour un petit jeu en flash de course que j'avais fait....et euh je fais deux fois mieux avec mes mains...comment accélérer le processus ?
    Dernière modification par Invité ; 24/07/2011 à 18h52.

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    1. STARTUPINFO et PROCESS_INFORMATION sont tout simplement des structures requises par la fonction CreateProcess. Le STARTUPINFO est en même temps une variable d'initialisation et une variable de sortie pour CreateProcess. Il arrive très souvent que l'on n'ait rien de spécial à spécifier et dans ce cas, on n'a qu'à mettre tous ses champs à zéro d'où le STARTUPINFO si = {0}. Le champ wShowWindow de cette structure permet de spécifier la manière dont on veut afficher la fenêtre principale de l'application. SW_SHOW indique que l'on veut l'afficher normalement, SW_HIDE que l'on veut qu'elle soit invisible, etc. Le PROCESS_INFORMATION quant à lui est juste une variable de sortie. On y récupère entre autres les handles du processus et de son thread principal. Documentation sur ces deux structures : STARTUPINFO et PROCESSINFO. Enfin, la ligne si.wShowWindow = SW_SHOW; est en fait inutile car SW_SHOW est déjà la valeur par défaut du champ wShowWindow mais c'était juste pour te montrer un exemple d'utilisation de la structure. Par contre, je ne vois pas où est-ce que tu veux en venir en parlant d'application console. Une console est une fenêtre comme une autre, je ne vois pas vraiment de problème.

    2. Pour ouvrir une page web, le plus simple c'est de faire ShellExecute(NULL, "open", "http://www.developpez.com/", NULL, NULL, SW_SHOW);. Il faut se lier avec shell32.lib pour utiliser cette fonction. Sinon, tu peux aussi lancer le navigateur que tu veux avec CreateProcess ou ShellExecute par exemple en spécifiant en argument de la ligne de commande l'url à ouvrir. D'autres méthodes existent également.

    3. C'est ton FindWindow qui n'est peut-être pas bon. Le "nom" d'une fenêtre c'est ce qui est écrit dans sa barre de titre. Es-tu sûr qu'il est juste écrit "Steam" dans la barre de titre de ta fenêtre ?

    4. Pour écrire directement une chaîne dans un contrôle, il faut avoir le handle du contrôle et utiliser SetWindowText. Pour obtenir le handle d'un contrôle particulier d'une fenêtre, il faut passer par les fonctions de recherche habituelles : FindWindow ou EnumWindows pour trouver la fenêtre parente puis FindWindowEx, EnumWindows, ChildWindowFromPoint, ChildWindowFromPointEx ou RealChildWindowFromPoint pour trouver le contrôle dans la fenêtre, selon les informations dont tu disposes.

    5. A mon avis, le problème justement c'est que le programme est trop rapide pour ton jeu flash. Mets une petite pause après chaque KEYEVENTF_KEYP, un p'tit Sleep(50); par exemple.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Merci c'est plus claire
    Enfin est ce que tu peux s'il te plait ( après j'arrête ) me faire un petit exemple de sélection d'une page déjà ouverte qui n'est pas au premier plan (genre bloc note) et y écrire directement une phrase ? Car je n'ai pas compris le point 4 sur l'écriture direct de texte.
    Sinon pour finir sleep, la valeur que l'on donne c'est quoi ? Je veux dire sleep(1) c'est 1/1000 de seconde ?

  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    1. Pour simplifier on va donc supposer qu'il n'y a qu'un seul notepad ouvert au moment de notre intervention. Le moyen le plus simple de récupérer le handle de la fenêtre de ce notepad est HWND hNotepadWindow = FindWindow("Notepad", NULL);. "Notepad" est en effet le nom de la classe de fenêtre de la fenêtre principale de notepad. Dans le cas général, où aucun, un seul ou plusieurs notepad peuvent être ouverts, il faut les chercher un par un à coups de FindWindowEx successifs par exemple. A sa première utilisation, FindWindowEx ressemble beaucoup à FindWindow. On met NULL pour l'argument hwndParent pour rechercher dans toutes les fenêtres sans parent. Ensuite, à chaque fois qu'on trouve une fenêtre, on rappelle la fonction en spécifiant également cette fois-ci le handle de la fenêtre dernièrement trouvée dans l'argument hwndChildAfter pour trouver la suivante. On répète jusqu'à ce que la fonction retourne NULL.

    2. Une fois le handle de la fenêtre de notepad cible obtenue, on récupère le handle de son unique contrôle EDIT - l'éditeur à proprement parler - à l'aide de HWND hNotepadEditor = FindWindowEx(hNotepadWindow, NULL, "EDIT", NULL);.

    3. A présent, il ne nous reste plus qu'à écrire dans ce contrôle EDIT avec SendMessage(hNotepadEditor, WM_SETTEXT, 0, LPARAM("Hello, world !\r\n")); par exemple. J'en profite pour faire remarquer que j'ai dit une bêtise plus haut. SetWindowText ne peut pas modifier le texte d'une fenêtre d'un processus étranger. Pour cela il faut utiliser WM_SETTEXT.

    Citation Envoyé par Magicflottant
    Enfin est ce que tu peux s'il te plait (après j'arrête)
    J'espère que tu arrêtes parce que tu as tout compris et non parce que tu en as assez posé de questions. On ne pose jamais assez de questions. Par contre, il faut aussi savoir bien prendre le temps d'approfondir chaque réponse donnée avant de continuer à en poser. Par exemple, à chaque fois que tu découvres une nouvelle fonction, avoir le réflexe de lire la doc de cette fonction.

    Citation Envoyé par Magicflottant
    Sinon pour finir sleep, la valeur que l'on donne c'est quoi ? Je veux dire sleep(1) c'est 1/1000 de seconde ?
    Lire la doc de Sleep .

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    AutoIt ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Un grand merci de ton aide, je pense avoir compris
    Au pire je sais où te trouver ^^

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/06/2014, 14h34
  2. Ouvrir les fichiers png avec un autre programme
    Par fabou3377 dans le forum NetBeans
    Réponses: 1
    Dernier message: 18/01/2010, 14h04
  3. Interaction avec un autre programme
    Par levit dans le forum C++
    Réponses: 5
    Dernier message: 05/07/2007, 16h13
  4. Interactions avec d'autres tables de la Bdd
    Par Antho13 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 15/06/2007, 21h59
  5. Comment afficher une valeur dans un edittext avec un autre programme
    Par pitizone dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 14/05/2007, 07h45

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