Texte selectionné sur une autre fenêtre

sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 - 12 mai 2005 à 20:15
Sabrran Messages postés 6 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 28 janvier 2006 - 15 janv. 2006 à 05:41
Bonjour a tous,

Je voudrais savoir s'il est possible de recuperer du texte selectionner dans une autre fenetre, par exemple j'ouvre le notepad, je tappe bonjour et je selectionne "jour", je voudrais pouvoir recuperer ce texte dans mon application.

C'est un peu primaire comme question mais bon, si vous avez une methode, meme si il faut passer part du code natif en C, n'hesitez, ca me fait meme pas peur d'ailleur c'est sur cette base que je suis partit, mais j'ai encore quelques soucis.

Je vais poser la meme question sur le sites de code-sources C/C++

Merci pour votre aide, a++

13 réponses

sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 20:17
désolé pour la phrase qui parle du code natif en C, c'est tres con de dire ca ici, c'est parcequ'a la base c'est une question que j'ai poser sur csharpfr, et j'ai oublier de modifier, desoler
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 mai 2005 à 20:43
Il faut d'abord que tu retrouve la fenêtre en question, par exemple
avec FinWindow("Notepad", 0) dans ton exemple, puis récupérer l'edit
correspondant avec EnumChildWindows. Tu obtiens donc l'handle d'un
edit, tu peux alors récupérer la sélection en envoyant à l'edit le
message EM_GETSELTEXT
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 22:49
ahh, voila le truc que je cherchais, EM_GETSELTEXT, j'etais pas vraiment sure mais mnt je vais essayer ca...

cependant, j'enumere deja toutes les fenetres, et ensuite j'enumere les childwindow (les sous objets) mais comment savoir le childwindow (parmis tout ceux enumeré) en question est un edit ? et aussi il y a plusieurs sorte de edit non ? et puis par exemple du texte sur une page html n'est pas du texte contenu dans un edit, si ?

voila, le debut etais bien, mais me faut plus de details, merci :)
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 23:04
selon MSDN :

"The EM_GETSELTEXT message retrieves the currently selected text in a rich edit control"

et j'ai tester, ca trouve quedal sur le notepad. j'ai tester en mode bourrin, j'ai fait ceci dans la EnumChildProc :

-------------------------------------------------------------
char *seltext;

seltext = (char*)SendMessage(hwnd, EM_GETSELTEXT, 0, 0);
if (seltext != NULL)
printf("seltext : %s\n", seltext);
-------------------------------------------------------------

et ca n'affiche rien, mais par contre ca fait planter certaines des applications auquels j'ai demander de recup le texte selectionné sur ces window enfants (Visual Studio plante directe)

y aurait pas un WM_GETSELTEXT ou un truc du genre ?
0

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

Posez votre question
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 23:20
bon ecoutez pas le petit monsieur la, il est fatigué

nan en fait j'ai re-ecrit les appel a SendMessage, il sont desormet correct, mais ca fonctionne toujours pas :S

--------------------------------------------
char seltext[4096];

memset(seltext, 0,
sizeof(seltext));
SendMessage(hwnd, EM_GETSELTEXT, 0, seltext);

printf("+ seltext : %s\n", seltext);
--------------------------------------------

voila, mais ca fonctionne toujours pas, mon buffer est toujours vide, meme si je selectionne du texte dans notepad ou dans un explorer
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 mai 2005 à 23:21
Tu n'a pas bien la MSDN: quand tu envoies EM_GETSETTEXT, tu dois
fournir un buffer dans lParam, la valeur de retour de SendMessage est
seulement le nombre de caractères copiés, tu ne t'en sers pas forcément:



char setText[TAILLE_MAX];

SendMessage(hwnd, EM_GETSELTEXT, 0, (LPARAM)selText);



Pour ce qui est de savoir si une fenêtre est un edit, tu regarde son nom de classe avec GetClassName:



char className[32];

GetClassName(hwnd, className, 32);

if(!lstrcmpi(className, "EDIT"))

{

// C'est un edit

}



La méthode que je donne ne marche que pour les EDIT. Pour une page HTML
par exemple, je pense que c'est tout simplement impossible. Comment
pourrait-on connaitre le texte séléctionné dans une fenêtre dont on
ignore tout, et la manière dont elle a été créée. EM_GETSELTEXT ne
marchera comme son nom l'indique que pour des EDIT (ou les RichEdit),
et pour le reste tu va avoir de grosses difficultés.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 mai 2005 à 23:22
Désolé j'avais pas eu le temps de voir ton dernier message
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 23:30
pas grave... mais de toute facon des personnes l'ont deja fait, c'est donc que c'est faisable...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 mai 2005 à 23:35
Mais comment veux tu par exemple connaitre le texte séléctionné par un
personne dans une fenêtre de Mozilla. Même si tu sais comment faire, il
faut que tu prévoie une solution pour chaque application (beaucoup
d'application utilisent des types de fenêtres qu'elles définissent
elles même et qui ne sont pas documentées)
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 23:42
Dans 99% du temps, tous les programmes utilisent les composant natif Win32, meme certaine lib style GTK ou Qt (je dit juste par exemple car j'avoue ne pas le savoir avec certitude) divent surement surcoucher les controles natif Win32. Java lui, a ses propres controles, mais il y a aussi une partie de la machine virtuelle Java qui utilie les controles natif.

Il est vrai qu'il est possible que le controle de rendu HTML de Mozilla est ete recoder integrallement, et dans ce cas mon programme ne fonctionnera pas, mais c'est pas dramatique, disons que c'est une penaliter acceptable.

Pour le reste, meme un controle de rendu HTML IE ou encore les trucs MSN et compagnie avec des images et tout, si du texte est selectionnable, il doit forcement etre aussi recuperable... maintenant j'admet ne pas savoir comment faire, et c'est aussi pour ca que je poste sur ce site, dans l'espoir que quelqu'un est deja fait ce que j'ai besoin de faire.
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
12 mai 2005 à 23:46
mais la question pour le moment c'est "pourquoi ca, ca ne fonctionne pas ?" :

----------------------------------------
GetClassName(hwnd, classname,
sizeof(classname));

if (lstrcmpi(classname, "EDIT"))

return (TRUE);
memset(seltext, 0,
sizeof(seltext));
len = SendMessage(hwnd, EM_GETSELTEXT, 0, (LPARAM)seltext);
----------------------------------------

len vaut tout le temps zero, j'ai tester en step by step, il y a bien un moment ou le classname contient "Edit", le code va bien sur le memset et le SendMessage, mais len vaut toujours 0, et mon buffer seltext est toujours vide.

je comprend pas.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 mai 2005 à 23:56
Ah oui c'est moi qui t'ai donné une mauvaise information: EM_GETSELTEXT
ne va que pour des RichEdit. Pour un EDIT il n'y a rien de ce genre,
EM_GETSEL te permet de connaitre les indices de debut et de fin de la
sélection. En récupérant tout le texte et en utilisant ces indices tu
peux obtenir le texte séléctionné:



DWORD dwBegin, dwEnd;

SendMessage(hwnd, EM_GETSEL, (WPARAM)&dwBegin, (LPARAM)&dwEnd);

char text[MAX];

GetWindowText(hwnd, text, MAX);

text[dwEnd] = 0;

char* p = text + begin;



Voila dans p tu devrais avoir le texte sélectionné dans l'EDIT
0
Sabrran Messages postés 6 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 28 janvier 2006
15 janv. 2006 à 05:41
Salut,



Vechio tu m'as fait changé tout mon code en disant que les EDIT prennent EM_GETSELTEXT !! Hehe si je t'écris c'est pas pour me plaindre mais pour te remercier. Je trouvais pas comment faire marcher
EM_GETSEL . Merci! Je confirme que ce code marche.
0
Rejoignez-nous