API windows (Probleme avec SendMessage(.... WM_SETTEXT.....)

Signaler
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009
-
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009
-
Salut, voici le code que j'utilise pour écrire dans la zone texte de notepad

int main()
{
    HWND hWnd, hWnd2; // Handles de fenêtre
    hWnd = FindWindow(NULL,TEXT("Essai - Notepad"));
            if (hWnd)    //Si on l'a trouvé
            {
                // Parcours de la hierarchie de classes de notepad
                hWnd=FindWindowEx(hWnd,0,TEXT("IME"),NULL);
                hWnd2=FindWindowEx(hWnd,0,TEXT("Notepad"),NULL);
                if(hWnd2) hWnd=hWnd2;
                hWnd=FindWindowEx(hWnd,0,TEXT("Edit"),NULL);
                SendMessage(hWnd,WM_SETTEXT,0,(long)"ALLO");
            }
}

Voici ce que j'obtient dans la zone texte du notepad : ??  au lieu de "ALLO"  Est-ce qlq aurais une idée du probleme?
A voir également:

8 réponses

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

Toujours la même chose... Que ce soit WM_GETTEXT ou WM_GETTEXT, il faut que le texte ou que le buffer de réception soit dans le processus cible.

Il faut que tu alloue une zone dans le processus DISTANT
(VirtualAllocEx), que tu écrives le texte dans le processus distant (WriteProcessMemory), que tu envoie ton WM_SETTEXT en lui passant l'adresse de la zone allouée dans le processus distant, que tu
libère la zone allouée dans le processus distant (VirtualFreeEx).
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Va impec avec du NON Unicode.
ex: http://www.cppfrance.com/code.aspx?id=23024

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
oups, on se croise avec rt15.

Pas besoin d'entrer dans le processus cible explicitement, l'appel WM_SETTEXT le fait implicitement.

ciao...
BruNews, MVP VC++
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009

Salut BruNews, je viens de voir ton exemple qui marche bien sur le notepad, mais mon programme en vérité écrit le texte dans un programme qui converti le texte en voix (Votre PC rend la parole). J'ai essayé de faire la meme chose que toi pour mon programme mais ton code me semble compliqué car Je suis encore débutant en C++ .
Voici la hierarchie de classes du convertisseur:
    //hWnd = FindWindow(NULL,TEXT("Votre PC prend la parole"));
    //if (hWnd)    //Si on l'a trouvé
    //    {
    //        hWnd=FindWindowEx(hWnd,0,TEXT("IME"),NULL);
    //        hWnd2=FindWindowEx(hWnd,0,TEXT("TMDSon"),NULL);
    //        if(hWnd2) hWnd=hWnd2;
    //        hWnd=FindWindowEx(hWnd,0,TEXT("TMemo"),NULL);
    //        SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)"ALLO");

J'ai ceci qui apparait dans la zone de texte : "??"  et j'ai pas comrpi  "Va impec avec du NON Unicode."  Peut-tu m'aider silteplait??
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009

Salut rt15 j'ai pas bien compri l'utilisaion des fonctions que tu m'a conseillé voici ce que j'ai écrit mais sa m'envoi toujours les memes caracteres bizares:

    string phrase="HELLO MIKI";
    char *ptr;
    ptr=&phrase[0];
    bool enable=true;
    SIZE_T dwSize=1024;
    hWnd = FindWindow(NULL,TEXT("Essai - Notepad"));
            if (hWnd)    //Si on l'a trouvé
            {
                // Parcours de la hierarchie de classes de notepad
                hWnd=FindWindowEx(hWnd,0,TEXT("IME"),NULL);
                hWnd2=FindWindowEx(hWnd,0,TEXT("Notepad"),NULL);
                if(hWnd2) hWnd=hWnd2;
                hWnd=FindWindowEx(hWnd,0,TEXT("Edit"),NULL);
               
                VirtualAllocEx(hWnd,NULL,dwSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
                WriteProcessMemory(hWnd,NULL,ptr,dwSize,NULL);
               
                SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)ptr);

                VirtualFreeEx(hWnd,NULL,dwSize,MEM_DECOMMIT);
            }
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
NIET, j'ai dit que WM_SETTEXT suffit.

Affiche donc par MessageBox ce que tu veux envoyer, tu verras ainsi ce que tu as.

ciao...
BruNews, MVP VC++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Ah oui, bien vu BruNews.

Et le problème vient probablement du fait que tu compiles en unicode rivaldinho.

int main()
{
    HWND hWnd, hWnd2; // Handles de fenêtre
    hWnd = FindWindow(NULL,TEXT("Essai - Bloc-notes"));
            if (hWnd)    //Si on l'a trouvé
            {
                // Parcours de la hierarchie de classes de notepad
                hWnd=FindWindowEx(hWnd,0,TEXT("IME"),NULL);
                hWnd2=FindWindowEx(hWnd,0,TEXT("Notepad"),NULL);
                if(hWnd2) hWnd=hWnd2;
                hWnd=FindWindowEx(hWnd,0,TEXT("Edit"),NULL);
                SendMessage(hWnd,WM_SETTEXT,0,(long)(TEXT("ALLO")));
            }
return 0;
}
Messages postés
28
Date d'inscription
jeudi 15 janvier 2009
Statut
Membre
Dernière intervention
23 avril 2009

Merci pour votre aide!! CA MARCHE

RIVALDINHO!!!!!!