API windows

Signaler
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Salut, j'utilise ce bout de code pour récupérer en temps réel le texte écrit sur notepad:


HWND hWnd, hWnd2; // Handles de fenêtre

    DWORD size, size2; // Taille du texte

    int i=0;

    char *pBuff=NULL; // Buffer de sortie

    //line pLigne;

  

    bool flag=true;


size=0;

debut:

    while (flag)

         {

            hWnd = FindWindow(NULL,TEXT("Essai - Notepad"));  // Titre du notepad : Essai

            if (hWnd)    //Si on l'a trouvé

                {

                hWnd2=FindWindowEx(hWnd,0,TEXT("Edit"),NULL); // Edit du notepad

     

                // Récupération de la taille de la chaine et allocation du buffer en conséquence

                size=SendMessage(hWnd2,WM_GETTEXTLENGTH,0,0);

                if(size==0)

                    {

                    flag=true;

                    goto debut;

                    }

                Else flag = false;

                    

                pBuff=(char *)malloc(size);

           

                // Get du texte

                SendMessage(hWnd2,WM_GETTEXT,size,(DWORD)pBuff);

       

                }


Le probleme c'est que la fonction ne fonctionne pas toujours et une
fois sur deux la fonction me retourne un size de 0 alors quil y a du
texte dans le notepad. Est-ce qulqu<un aurait une idéedu probleme??

4 réponses

Messages postés
70
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2013

Bonjour,

dans ton code je vois la fonction goto, on ma toujours dit que cette fonction était a bannir en c/cpp. Par contre tu peux remplacer ton goto par une boucle for ou bien même une boucle while.
Essai d'en tenir compte et tiens moi au courant !

Bonne fin de journée

Romain
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

romain60112 -> En programmation, il y a effectivement des pratiques considérées comme bonne ou mauvaise. L'usage du goto est souvent déconseillé dans le domaine universitaire, et mal considéré par les analyseurs automatiques de la qualité du code.

Néanmoins, il n'y a pas unanimité pour ce qui est du goto, qui n'est pas exempt d'avantages dans certains cas.

Lire ce thread qui a dérivé sur le thème du goto.

rivaldinho -> Tes derniers messages ont tous le même titre, mais ne parle pas de la même chose, même s'il s'agit effectivement d'API Windows. Tu pourrais essayer d'être un peu plus précis, style [API Windows]Retour invalide lors de l'envoie d'un WM_GETTEXT à notepad. Encore que je suis peut être le seul à être fan des [].

Concernant ton problème... Première piste, l'adresse que tu fournis pour réceptionner le titre doit être valable dans le processus DISTANT.

Il faut que l'allocation se fasse dans le processus DISTANT (VirtualAllocEx), que tu envoie le message, que tu recopies la valeur du processus DISTANT vers le processus (ReadProcessMemory), que tu libère la zone allouée dans le processus distant (VirtualFreeEx).
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009

Le probleme n'est pas dans l'allocation de la mémoire mais bien à la ligne :
hWnd2=FindWindowEx(hWnd,0,TEXT("Edit"),NULL); // Edit du notepad
où il ne trouve pas le handle dans notepad de la zone de texte??
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Ah bon. Au fait, pour voir un peu comment retrouver une fenêtre par programme, utiliser spy++, fourni avec Visual Studio, c'est bien pratique.

Pour la zone de texte de notepad, j'avais fait ça en speed.