capturer le texte sélectionné dans n'importe quelle appli

capturer le texte sélectionné dans n'importe quelle appli - API Win32 - Programmation

Marsh Posté le 09-09-2008 à 16:05:55    

Bonjour
 
un client voudrait qu'on lui développe une application qui tourne en tache de fond et soit capable, sur action utilisateur (combinaison de touches, clic sur une icone systray...) de capturer le texte sélectionné dans n'importe quelle autre application windows et de l'utiliser ensuite dans une activeX dont nous disposons.
 
En fait, c'est pour faire un "clic to call" (numérotation téléphonique). L'ActiveX dispose d'une méthode qui permet de déclencher l'appel, mais il faut l'alimenter avec le numéro de téléphone à composer. Le client voudrait que notre application puisse récupérer ce numéro dans n'importe quelle application windows (sélection par utilisateur d'une zone de texte  quelconque - document office, page web, champs dans un applicatif d'annuaire...- contenant un numéro)
 
Ca serait possible? vous pouvez m'indiquer comment faire?
 
PS: l'appli à créer serait probablement développée en VB, mai c e n'est pas une obligation.

Reply

Marsh Posté le 09-09-2008 à 16:05:55   

Reply

Marsh Posté le 10-09-2008 à 21:13:51    

C'est évidemment possible puisque skype le fait déjà, et remplace même n'importe quel texte en une icone cliquable qui numérote automatiquement dans skype.
 
Une piste :  
 
Si tu veux faire ca via une combinaison de touches, regarde du coté des hotkeys (voir doc MSDN).
Sinon, tu peux faire ça de la meme facon que spy++ en survolant simplement les objets graphiques des différentes applications lancées.
 
Sachant que les handles sont publics sous windows, tu pourras récupérer facilement le handle de ta sélection (voir spy++ ou le code source d'un équivalent pour voir comment faire).
 
Ensuite avec ce handle, tu peux tester si l'objet sélectionné (soit parcequ'on a cliqué dessus, soit parce qu'il a le focus) est un objet de type texte, et ensuite tu peux récupérer la sélection courante, et détecter qu'il s'agit d'un numéro de téléphone, et le cas échéant, envoyer celui-ci via un message à ton application.
 
Attention, tu ne peux faire ca qu'avec les objets de l'API win32. Pour un controle entièrement redessiné, il te sera impossible de récupérer simplement le texte. Dans ce cas, il faut être un peu plus rusé, faire une capture d'écran de la zone visée, et faire une analyse OCR sur la bitmap (ex : babylon translate le fait).  
 

Reply

Marsh Posté le 10-09-2008 à 21:53:47    

ok, merci, je vais creuser ces pistes. le coup de la capture+OCR, je l'avais bien iméginé, mais j'oublie : bien trop compliqué.
 
donc on se contentera de l'API win32.

Reply

Marsh Posté le 12-09-2008 à 13:15:15    

simaril a écrit :

le coup de la capture+OCR, je l'avais bien iméginé, mais j'oublie : bien trop compliqué.

Non pas du tout, c'est plus simple, xilebo t'a indiqué comment faire, et ça fonctionne quelque soit l'appli.


Message édité par Trap D le 12-09-2008 à 13:15:41
Reply

Marsh Posté le 12-09-2008 à 13:41:59    

La difficulté n'est pas dans la capture d'écran, mais plutot dans l'analyse OCR. Peut-être existe-t-il des bibliothèques toutes faites (open source ou payantes) implémentant déjà la fonction mais je n'en connais pas.
 

Reply

Marsh Posté le 12-09-2008 à 20:43:57    

J'avis utilisé à l'époque Textract qui est une API payante (elle m'était imposée), mais on en trouve peut-être d'autres gratuites.
Je passais la zone d'écran et la dll se débrouillati toute seule, si la police n'était pas trop exotique et les contrastes corrects, ça marchait bien.

Reply

Marsh Posté le 13-09-2008 à 10:28:57    

Il n'y a évidemment pas besoin d'OCR (encore heureux..)
Les diverses méthodes ont été données maintes fois sur le forum pro des apis (news://194.177.96.26/fr.comp.os.ms-windows.programmation)

Reply

Marsh Posté le 13-09-2008 à 12:01:26    

Malheureusement le lien news..ne marche pas : "Vous n'êtes pas autorisé à accéder à cette rubrique" (depuis mon PC familial sans restriction particulière).
 
J'avais essayé des enumChildWindows(), etc. Effectivement, on récupère des handles de fenêtre, des handles de contrôle, et la position de ces éléments. Mais ce n'était pas évident malgré tout, parce qu'il y a des problèmes du genre : tel élément existe, mais il est invisible, ou bien caché par autre chose, donc il ne faut pas le prendre en compte, ou bien on a le contenu d'un contrôle, mais uniquement de manière globale, et on ne sait pas quelle police est utilisée, et où se trouve précisément chaque caractère.
 
Donc, s'il y a un moyen facile, j'aimerais bien voir un petit exemple.


Message édité par olivthill le 13-09-2008 à 12:02:23
Reply

Marsh Posté le 06-09-2010 à 09:24:43    

Bonjour,
 
quelqu'un a un bout de code a proposer pour réaliser la capture de texte sous Windows?
 
je suis actuellement sur un problème similaire et je n'arrive pas à le résoudre :)
 
 
cordialement

Reply

Marsh Posté le 06-09-2010 à 13:38:50    

Comme écrit, vas voir dans le groupe de news fr.comp.os.ms-windows.programmation
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-09-2010 à 13:38:50   

Reply

Marsh Posté le 23-11-2010 à 20:39:10    

bonjour tu peut capter le handle de la fenetre avec findwindow de la user32.dll
la getwindows text et le setwindowtext de la meme dll
 
enfin les api le font tres bien : :pt1cable:

Reply

Marsh Posté le 14-12-2010 à 15:16:21    

Autre piste beaucoup plus simple : récupérer le contenu du presse-papier.
Voir les fonction de l'API : http://msdn.microsoft.com/en-us/li [...] 85%29.aspx
 
Après le soft qui récupère les données peut ou non effacer le presse-papier après la récupération.
 
Mais ça demande à l'utilisateur un petit boulot de plus : sélectionner ET copier...


---------------
If I want to fail and succeed, which I have done ?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed