Manipuler une application externe [Résolu]

Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
- - Dernière réponse : madkeyboard
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
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
Afficher la suite 

Votre réponse

18 réponses

Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Dernière intervention
8 mars 2017
0
Merci
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
Commenter la réponse de cs_louis14
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de Renfield
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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
Commenter la réponse de madkeyboard
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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
Commenter la réponse de madkeyboard
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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);
Commenter la réponse de madkeyboard
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
Pas confondre Handle de l'appli et de ta fenetre...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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 ?
Commenter la réponse de madkeyboard
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Dernière intervention
8 mars 2017
0
Merci
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
Commenter la réponse de cs_louis14
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de Renfield
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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
Commenter la réponse de madkeyboard
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de Renfield
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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
Commenter la réponse de madkeyboard
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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 ^^
Commenter la réponse de madkeyboard
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de Renfield
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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 ?
Commenter la réponse de madkeyboard
Messages postés
100
Date d'inscription
mercredi 27 avril 2011
Dernière intervention
21 décembre 2012
0
Merci
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
Commenter la réponse de madkeyboard
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
-2
Merci
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
Commenter la réponse de Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
-2
Merci
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
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.