none
Capture d'un texte dans un programme externe RRS feed

  • Question

  • Bonjour,

    Je voudrais savoir comment capturer le texte qui se situe dans un autre programme?

    Je m'explique. J'ai un programme qui tourne du nom de DIMS (Application métier). Dedans on saisie dans une textbox un noms. J'ai besoin de contrôler si ce noms fait partis d'une liste.

    Merci par avance de votre aide

    Cdt,

    Keros

    jeudi 29 novembre 2012 19:27

Toutes les réponses

  • ... Je voudrais savoir comment capturer le texte qui se situe dans un autre programme?

    ... J'ai un programme ... Dedans on saisie dans une textbox un noms. J'ai besoin de contrôler si ce noms fait partis d'une liste ...

    Bonjour Keroros Gunso,

    Faut-il en déduire que la liste appartient à un autre programme ?

    Et si c'est le cas, est-ce ton programme aussi, ou as-tu accès au fichier qui constituent la liste de cet autre programme ?

    Ce qui voudrait dire que tu as un programme P1 où on saisit dans une TextBox, saisie que tu veux contrôler grâce à un second programme P2 qui contient une liste, est-ce ça ?

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    vendredi 30 novembre 2012 10:39
  • Bonjour,
    Il faut passer par les API Windows.
    Je n'ai pas d'exemple de code mais il y en a à la fin de cette page :
     
    Pour aider, il y a des programmes qui permettent d'analyser les fenêtres
    (au sens Windows=> un label est une fenêtre).
    Je crois Spy++, qu eje n'ai pas sur ma machine.
    Dans le SDK Windows 7.0, j'ai un "Inspect Objects" qui ferait également
    l'affaire
     

    Fred
    vendredi 30 novembre 2012 12:35
  • Bonjour,

    Il me semble qu'il existe une autre solution en .net 
    d’après mes souvenirs il faut que la porter du conrtol soit accessible avec une porter assez haute pour inter-agir a partir d'un autre programme (Public il me semble).

    Il faut aussi connaitre le nom du control pour faire les modif voulu ...

    mais je me souviens plus comment faire pour le reste

    je vais essayer de retrouver comme faire !


    Cordialement,

    vendredi 30 novembre 2012 23:42
    Auteur de réponse
  • Bonjour,

    Tous d'abord, merci de l’intérêt que vous porter a mon sujet.

    EhJoe:"Faut-il en déduire que la liste appartient à un autre programme ?" -> Cette liste est une liste toute simple sous Excel

    EhJoe:"Et si c'est le cas, est-ce ton programme aussi, ou as-tu accès au fichier qui constituent la liste de cet autre programme ?" -> J'ai accès à la liste et je l'ai déjà importer dans mon programme

    EhJoe:"Ce qui voudrait dire que tu as un programme P1 où on saisit dans une TextBox, saisie que tu veux contrôler grâce à un second programme P2 qui contient une liste, est-ce ça ?" -> Oui exactement

    Foleide._:Merci, je regarderai demain matin pour voir si c'est bien ça.

    Troxsa: Merci pour tes recherche.

    Cordialement.

    samedi 1 décembre 2012 08:50
  • Bonjour,

    Désoler, j'ai fais pas mal de recherche sur google mais impossible de retrouvé le message qui en parle !
    Mais je suis sur qu'il existe un autre moyen .net, que d'utiliser des API diverses ...

    A bientot


    Cordialement,

    samedi 1 décembre 2012 18:46
    Auteur de réponse
  • Bonjour,

    Je suppose que vous pensiez à http://msdn.microsoft.com/fr-fr/library/ms747327.aspx ;-) Cette API est consacrée à la prise en charge de l'accessibilité, et se trouve donc de fait apte à inspecter par programmation l'interface utilisateur d'un autre programme.

    Après on dirait que l'on veut modifier le fonctionnement d'un programme sans disposer de ses sources. Ce serait peut-être plutôt qq chose à prévoir au niveau de ce programme ? Impossible d'en récupérer le code source ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    samedi 1 décembre 2012 19:21
    Modérateur
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 3 décembre 2012 10:28
  • Bonsoir.

    Aurel Bera: Désoler, je n'ai pas pu essayer les divers solutions apportées.

    Foleide._: J'ai pas réussi à utiliser ce bout de code même en suivant tout le topic...

    Patrice Scribe: Pour l'API "UI Automation", j'ai pas compris grand chose mais je vais continuer a creuser la piste pour essayé de voir ce que je peux en tirer

    Cdt,

    Keroros Gunso

    lundi 3 décembre 2012 17:31
  • BonjourIci vous avez un exemple de code pour la solution de EhJoe.

    Vous avez besoin d’un logiciel Spy  (inclus d’habitude dans Visual Studio)  pour trouver le nom de la fenêtre et le nom du champ que vous voulez «lire »  - remplacez NOM_DE_LA_FENETRE et Champ_a_lire:

    Imports System.Runtime.InteropServices
    Public Class Form1
        Private Const WM_GETTEXT As Integer = &HD
        Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, _
        ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
                                             ByVal childAfter As IntPtr, _
                                             ByVal lclassName As String, _
                                             ByVal windowTitle As String) As IntPtr
        End Function
     
        Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Find the running notepad window
            Dim Hwnd As IntPtr = FindWindow("NOM_DE_LA_FENETRE", Nothing)
     
            'Alloc memory for the buffer that recieves the text
            Dim Handle As IntPtr = Marshal.AllocHGlobal(100)
     
            'send WM_GWTTEXT message to the notepad window
            Dim NumText As Integer = SendMessage(Hwnd, WM_GETTEXT, 50, Handle)
     
            'copy the characters from the unmanaged memory to a managed string
            Dim Text As String = Marshal.PtrToStringUni(Handle)
     
            'Display the string using a label
            Label1.Text = Text
     
            'Find the Edit control of the Running Notepad
            Dim Childhandle2 As IntPtr = FindWindowEx(Hwnd, IntPtr.Zero, "Champ_a_lire", Nothing)
     
     
            'Alloc memory for the buffer that recieves the text
            Dim Hndl As IntPtr = Marshal.AllocHGlobal(200)
     
            'Send The WM_GETTEXT Message
            NumText = SendMessage(Childhandle2, WM_GETTEXT, 200, Hndl)
     
            'copy the characters from the unmanaged memory to a managed string
            Text = Marshal.PtrToStringUni(Hndl)
     
            'Display the string using a label
            TextBox1.Text = Text
     
        End Sub
    End Class


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Proposé comme réponse TroxsaEditor samedi 8 décembre 2012 22:17
    mercredi 5 décembre 2012 11:56
  • Bonjour,

    Le code ci-dessus donner par Aurel Bera fonctionne avec des applications qui peuvent prendre en charge le fonctionnement, il arrive que ça ne fonctionne pas avec toute les applications, si Spy est capable de lire le champ alors ça fonctionnera sinon non.

    Quand je disais (voir plus haut) qu'il existe un autre moyen en .net de faire des modifications entre deux programmes, je voulais dire : de faire des modifications entre deux projets .net. Du style Projet1 qui modifie le textbox3.Text du projet2 (deux environnement visual Studio ... avec un projet chacun).

    Impossible de me souvenir du code ou de me souvenir sur quel site j'ai vu ça !


    Cordialement,

    • Proposé comme réponse TroxsaEditor samedi 8 décembre 2012 22:17
    • Non proposé comme réponse TroxsaEditor samedi 8 décembre 2012 22:17
    mercredi 5 décembre 2012 18:08
    Auteur de réponse
  • En gros, je soupçonne qu'il ne s'agit que d'une couche au dessus de l'API Windows classique illustrée par Ehjoe, destinée à fournir une vue plus "objet".

    Par exemple le code suivant http://mostlytech.blogspot.fr/2008/01/uiautomation-testing-calculator.html manipule la calculatrice Windows en "inspectant" différent élements. De mémoire, il est possible de les découvrir en inspectant l'interface (ce qui donc en base niveau va sans doute déclencher des EnumWindows et autres appels bas niveau).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Proposé comme réponse TroxsaEditor samedi 8 décembre 2012 22:17
    mercredi 5 décembre 2012 18:52
    Modérateur
  • Keroros Gunso

    Pourriez vous nous dire si vous avez trouver solution a votre problème (avec les messages du forum ?) ?

    Si une des réponses vous a aidé a trouver la solution pourriez vous nous le dire ?


    Cordialement,

    samedi 8 décembre 2012 19:38
    Auteur de réponse
  • Bonsoir,

    Désoler pour le temps de réponse.

    J'ai testé le code de Aurel Bera. lors, j'ai réussi à le faire fonctionner avec la calculatrice. Cependant, je n'ai pas réussi à le faire fonctionner avec BMC Remedy. Peut être que je m'y prend mal. Lundi je mettrai des capture d’écran.

    J'ai pas encore eu le temps de bien regarder le liens de Patrice Scribe.

    Merci de votre attention^^.

    samedi 8 décembre 2012 20:12
  • Keroros Gunso,

    BMC Remedy est très mal foutu en terme de programmation, j'avais fait un programme qui manipule BMC Remedy mais avec sendkey c'est le seule moyen que j'avais trouvé a l'époque. il me semble avoir vu des lib BMC Remedy qui faut ajouté au projet, mais pas de documentation sur le net (en tout cas a l'époque "7 ans").

    a bientôt 


    Cordialement,

    samedi 8 décembre 2012 21:54
    Auteur de réponse
  • j'ai fini par retrouvé le lien :)

    http://www.microsoft.com/france/vision/Msdn-tv/Webcast.aspx?EID=01fa0d1c-a0b5-4c29-95e9-4a903ddba672

    Microsoft France

     Pourriez vous svp, demander au webmaster Microsoft de remettre les liens ? car au niveau téléchargement c'est pas possible de télécharger quoi que ce soit

    A vous de jouer ;)


    Cordialement,


    lundi 10 décembre 2012 20:45
    Auteur de réponse
  • Bonjour

    J’ai contacté les responsables, mais ça peut être une opération qui va prendre beaucoup de temps (sont des fichiers anciens Framework 2.0).

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 11 décembre 2012 13:53