Manipuler une application externe

Résolu
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 - 11 mai 2011 à 10:56
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 - 23 mai 2011 à 10:33
Bonjour !

Je vous présente mon problème : je réalise une application qui doit, entre autre, ouvrir un logiciel et permettre quelques manipulations avec ce logiciel...
Pour l'ouverture, je m'en suis sorti comme suit :

public string LancerFormControl(string stPathFC)
{
string stReturnError = "Pas d'erreur";
Process ProcessFC = new Process();

try
{
ProcessFC.StartInfo = new ProcessStartInfo(stPathFC);
ProcessFC.Start();
}
catch(Exception exception)
{
stReturnError = exception.Message;
}

return stReturnError;

}


Après, j'aimerais pouvoir faire :
- Enregistrer le projet en cours, en lui donnant un nom et un chemin d'accès ;
- Ouvrir un projet ;
- Vérifié si un projet est bien ouvert ;
- Et, le top du muste, ce serait de pouvoir récupérer des informations dans l'application !!!

J'ai vu qu'il existait, entre autre, une fonction "BeginOutputReadLine()", peut-être pour lire des informations du logiciel, mais je n'ai pas encore testé.
Par contre, pour l'ouverture et l'enregistrement, la seul chose que j'ai trouvé qui pourrait m'aider que j'ai trouvé, c'est "SendKey", avec une instruction du genre : SendKey.SendWait("lulu va au marché {ENTER}");
Mais je voudrais quelque chose de moins aléatoire ! Pas une même commande que l'utilisateur !
En gros, au lieu de cliquer sur enregistrer, il faudrait que je puisse appeler directement la méthode du logiciel qui permet de faire l'enregistrement !

Notez seulement que s'il est possible d'envoyer des lignes de commandes à l'appli, j'ai possibilité d'obtenir, par le constructeur, les commandes correspondantes (sous quelles forme, je n'en sais fichtre rien ! des prototypes de fonctions ???...)

Si quelqu'un a une idée... Tks ^^

Mad Keyboard

18 réponses

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 mai 2011 à 08:50
Bonjour,
il y a ces liens qui peut t'aider :
http://www.codeproject.com/KB/cs/take-over.aspx
http://www.codeproject.com/KB/cs/Auto_Clicker_Bar.aspx
http://www.codeproject.com/KB/vb/ByPassAutomation.aspx
http://www.codeproject.com/KB/cs/automator.aspx

Tu ne précises pas si tu as le code de ton autre application et si tu peux le modifier.


louis
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2011 à 13:56
APIs...

SendMessage en principal
manipuler les controles via leur ID, etc.

chaque action de l'utilisateur est en fait transmise a l'application via ces messages, donc no limit !

voir ma source de cours de pilotage d'applications

oublies la simulation de click, les SendKeys, etc.

si tu as des questions, n'hesites pas, je pilote pas mal de softs...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
16 mai 2011 à 09:09
Déjà, merci pour votre soutien, j'examine tout cela ce matin !

Ensuite :
[quote:louis14]Tu ne précises pas si tu as le code de ton autre application et si tu peux le modifier./quote
C'est vrai !
En fait, non. C'est un logiciel développé par BLUM, pour un usage uniquement professionnel, ils ne laisse donc bien sur aucun accès à leurs sources ^^
Maintenant, ils sont très ouverts au dialogue, c'est pour cela que l'on peut obtenir des informations concernant leur soft, mais je ne pourrait jamais modifier le source !

Je vous recapte en cas de souci !

Mad Keyboard
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
16 mai 2011 à 11:17
Cas de souci !!!

=>
Je code en C#. J'ai regardé vos sources, j'avoue que je galère à transcrire le tout en C# !

Pour Louis : Je pense comme Renfield, je voudrais éviter l'automation, qui est trop approximative, surtout pour une application professionnelle ! Le seul de tes 4 sources qui m'intrigue, c'est le 3ème (ByPassAutomation.aspx), malheureusement, c'est le seul codé en VB ! J'ai donc pas pigé grand chose...

Pour Renfield : J'ai regardé ton source : "COURS DE PILOTAGE........D'APPLICATIONS" (pour ceux que cela intéresse : http://www.vbfrance.com/codes/COURS-PILOTAGE-APPLICATIONS_51165.aspx)

J'avoue que cela ressemble parfaitement à ce que je cherche ^^
Mais comme c'est en VB, je galère à tester... Voila ce que j'ai essayé :

public string LancerFormControl(string stThisPathFC)
        {
            string stReturnError = "Pas d'erreur";
            Process ProcessFC = new Process();
            int iProcID = 0;
            int iProcHandle = 0;

            try
            {
                ProcessFC.StartInfo = new ProcessStartInfo("calc.exe");
                ProcessFC.Start();

                iProcHandle = ProcessFC.Handle.ToInt32();
                iProcID = ProcessFC.Id;

                SendMessage(iProcHandle, 0x111, 304, 0);
            }
            catch (Exception exception)
            {
                stReturnError = exception.Message;
            }

            return stReturnError;
        }

La méthode est appelée par un clic d'une interface.
Elle s'appelle "LancerFormControl", parce que plus tard, elle lancera le logiciel Form Control ^^ Je profite pour faire des teste de manipulation à l'intérieur.

J'ai donc simplement essayé de passer la calculette en mode scientifique... J'ai au moins réussi à avoir un prototype qu'il acceptait, en me basant sur ton code et sur : http://msdn.microsoft.com/fr-fr/library/ms939980.aspx (Je vois que sur cette page, le dernier paramètre n'est pas passé en référence, contrairement à ton code ?)

Mais il ne se passe rien !!!
Peut-tu m'aider, me dire où j'ai bien pu me planter ???

Merci d'avance !

Mad Keyboard
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
16 mai 2011 à 11:19
Ha ! J'oublie un tru fondamental !
La déclaration de la fonction SendMessage :
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
static extern int SendMessage(int hWnd, int wMsg, int wParam, int lParam);
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 mai 2011 à 11:21
Pas confondre Handle de l'appli et de ta fenetre...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
18 mai 2011 à 10:55
Arf, quel boulet !

Bon, j'ai ressayé avec le handle de la fenêtre, cette fois-ci :
public string LancerFormControl(string stThisPathFC)
{
    string stReturnError = "Pas d'erreur";
    Process ProcessFC = new Process();
    int iProcID = 0;
    int iProcHandle = 0;
    int iUseLess = 0;

    try
    {
        ProcessFC.StartInfo = new ProcessStartInfo("calc.exe");
        ProcessFC.Start();

        iProcHandle = ProcessFC.MainWindowHandle.ToInt32();
        iProcID = ProcessFC.Id;

        SendMessage(iProcHandle, 0x111, 304, iUseLess);
    }
    catch (Exception exception)
    {
        stReturnError = exception.Message;
    }

    return stReturnError;
}


Toujours aucun résultat :s
Une autre idée ?
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
18 mai 2011 à 11:05
Bon pas de souci pour VB :
tu télécharges Sharpdevelop et il y a un menu qui fait la transcription de VB vers C# ou l'inverse.
http://sharpdevelop.net/opensource/sd/


louis
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 mai 2011 à 13:34
attend bien que ton MainWindowHandle ne soit pas nul : quel la fenetre soit bien créée




Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
18 mai 2011 à 17:38
Merci Louis ! C'est intéressant ça ^^
Je regarde demain ! Si ça prend en charge aussi le .NET, c'est de la tuerie !

Et pour Renfield, décidément, je passe vraiment à côté de détails essentiels et plutôt gros comme des maisons... ^^

Malheureusement, ça marche toujours pas !

J'ai juste rajoutté une petite boucle :
do
{
    iProcHandle = ProcessFC.MainWindowHandle.ToInt32();
    iProcID = ProcessFC.Id;
} while (iProcHandle != 0);

Il complie, il exécute et il plante pas, et il sort de la boucle (je peux relancer la fonctino après)...
Mais il passe toujours pas en mode scientifique
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mai 2011 à 09:53
Il n'y a pourtant pas grand chose :


        private void button1_Click(object sender, EventArgs e) {
            Process p = Process.Start("calc.exe");
            p.WaitForInputIdle();

            IntPtr hWnd = p.MainWindowHandle;

            SendMessage(hWnd, 0x111, 304, 0);
            // SendMessage(hWnd, 0x111, 305, 0);  Mode standard
        }


Fonctionne au poil chez moi ...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
20 mai 2011 à 10:56
Il me manquait le WaitForInputIdle() !!!
En plus je m'était déja demander comment on faisait cette attente, vu que le logiciel que je veux controler est assez long a charger ^^

Un grand merci à toi, c'est au top !

Juste un dernier petit truc : est-ce que tu aurais une idée de la manière dont fonctionne le sendmessage ? Enfin je veux dire plutôt la manière dont l'application réceptionne le message et l'interprête ? (dans les grandes lignes) Et si toutes les applis réceptionnent nécessairement quelque chose ou non ?
Ca pourrait m'aider pour préciser ma demande pour obtenir des info sur le logiciel !

Merci encore !
Mad Keyboard
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
20 mai 2011 à 11:40
Génial, je saisi un peu mieux le concept !

Il me reste un dernier petit détail :
je cherchais désespérément un endroit ou serait listée des instructions type pour des appli windows de base (comme ton exemple avec le calc !), comme par exemple enregistrer un fichier, ou ouvrir, fermer la fenêtre...
Selon tes dire, il faudrait trouver les clics de souris correspondant, par exemple ?

J'ai fait le tour de msdn et des fofos, j'ai pas trouvé grand chose, sais j'ai trouvé un truc intéressant (pour ceux qui cherchent quelques info la dessus) :
http://msdn.microsoft.com/fr-fr/library/ms644927(v=VS.85).aspx#system_defined

Dans le chapitre "Windows Messages" : On a une explication assez bien fichu du fonctionnement de tout ça ! faut avoir la motiv de lire l'anglai (ou google trad, c'était pas trop dégueux ^^)

Dans le chapitre "System-Defined Messages" : J'ai pu trouvé le genre de liste que je cherchais !!!

Mais j'avoue que je m'y perds un peu ! J'essai d'éplucher le tas d'info, mais je sais pas trop comment m'y prendre... Par exemple, si je veux enregistrer un fichier, je suis obligé de simuler les clics de souris, ou je peux trouver un message qui reproduit la réaction du boutton "Save" de la boite de dialogue ? (en gros qui envoie l'info "sauvegarde" et le chemin du fichier)

Dès que j'arriverais à faire ça, je pense que je pourrais me débrouiller ^^
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 mai 2011 à 13:11
toi, t'as pas lu mon tuto...

via une appli type "Spy++" tu pourras voir les messages qui transitent, et le WM_COMMAND (et son ID) correspondant à cette commande

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
23 mai 2011 à 09:24
Beeen...

=>
Participations de Renfield
Sur tous les sites
132 sources , 0 tutoriel CS, 1 tutoriel TS, 57 snippets
3 763 commentaires (source)
12 909 messages (forum)
35 758 pts

Et sur le tuto, j'ai :
"Effectuer une recherche dans le contenu de fichiers", qui n'est pas le sujet qui m'intéresse !

J'ai parcouru une partie de tes sources, et tous tes "snippets", la seule qui correspond au sujet, c'est : "COURS DE PILOTAGE........D'APPLICATIONS", et j'ai déja fait le tour ^^

Y'aurait-il un truc que j'ai manqué bêtement ?
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
23 mai 2011 à 10:33
A ouai ! j'avais pas vu le .doc ! Désolé :s

En effet, là j'ai tout ce qu'il me faut pour avancer !!!
Je te remercie pour toute ton aide et pour ta patience ^^

Je clos ce topic, si jamais j'ai vraiment un souci, je repasserais poser un message, mais la je pense que je devrais m'en sortir !

Merci encore et à une prochaine !

Mad Keyboard
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 mai 2011 à 11:17
Chaque appli a une file d'attente des messages
chaque fenetre aussi

regulierement, le processus va lire les messages, dans l'ordre d'arrivée.

clics, touches du clavier, etc.
tout passe par les messages.

au final, il est plus efficace de piloter les applis par ce biais, puisque le "qui a le focus" importe peu...

voir mon tuto pour en apprendre davantage.

je reste a ta disposition si tu as d'autres questions

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
-2
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mai 2011 à 09:37
Je parle bien de cette source, sur le pilotage d'applis.

te montre l'utilisation de Spy++ pour voir les messages qui transitent vers une fenetre donnée.

en ciblant les WM_COMMAND (avec un filtre), tu pourras savoir les parametres à envoyer pour simuler tel ou telle commande.


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
-2
Rejoignez-nous