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

cs_rivaldinho Messages postés 28 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 23 avril 2009 - 18 févr. 2009 à 17:40
cs_rivaldinho Messages postés 28 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 23 avril 2009 - 18 févr. 2009 à 22:46
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?

8 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 févr. 2009 à 18:25
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).
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 févr. 2009 à 18:28
Va impec avec du NON Unicode.
ex: http://www.cppfrance.com/code.aspx?id=23024

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 févr. 2009 à 18: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++
0
cs_rivaldinho Messages postés 28 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 23 avril 2009
18 févr. 2009 à 20:40
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??
0

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

Posez votre question
cs_rivaldinho Messages postés 28 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 23 avril 2009
18 févr. 2009 à 20:52
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);
            }
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 févr. 2009 à 21:01
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++
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 févr. 2009 à 22: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;
}
0
cs_rivaldinho Messages postés 28 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 23 avril 2009
18 févr. 2009 à 22:46
Merci pour votre aide!! CA MARCHE

RIVALDINHO!!!!!!
0
Rejoignez-nous