IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Récupérer le texte surligné dans n'importe quelle fenêtre Windows [WD14]


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 57
    Points : 53
    Points
    53
    Par défaut Récupérer le texte surligné dans n'importe quelle fenêtre Windows
    Bonjour à tous.

    Je viens en ces lieux car je me retrouve bloqué sur le développement d'une petite fonctionnalité et mon manque de connaissance sur ce type de programmation se fait grandement ressentir !

    tout d'abord ce que je voudrais faire :


    je voudrais être dans n'importe quelle fenêtre de mon environnement (firefox,word, excel...) et récupérer le texte sélectionne à la souris afin de le glisser dans une variable. Pour récupérer le texte, je tape sur une touche préconfigurée (F8) et cette partie est testée et fonctionnelle.


    mon problème :
    j'ai parcourru beaucoup de forums et de liens pour m'apercevoir que je dois interagir avec les API de windows. Mon gros problème, c'est que je ne les connais pas et j'avance à tatillon.

    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // récupération du handle de la fenêtre active
    hwnd=API("USER32","GetForegroundWindow")
    
    Trace(hwnd)
    // vérification que la récupération se fait bien = ok
    
    //récupération du thread principal
    API ("USER32","GetWindowThreadProcessId",hwnd,&processID)
    
    //affichage du PID = ok
    Trace(processID)
    c'est à partir de la que je me perd. Il faudrait que je récupère le controle du champ qui contient le texte...
    Il faudrait utiliser EnumChildWindow pour récupérer controles des champs de la fenêtre mais je ne comprend pas comment l'implémenter.

    ET voici la fin de mon code qui devrait récupérer le texte du champ (si hwnd est le handle de la fenêtre active, je ne récupère rien).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    API("USER32","SendMessageA", hwnd, "GetWindowText",&lparam,40)
    Trace(lparam)

    j'ai essayé de récupérer aussi la position du curseur initial et final (pour la sélection de texte) mais je n'y arrive pas.

    Je suis preneur de toute solution.

    Pour info vous trouverez ici une des réponses les plus pertinente que j'ai pu trouver.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Juste une question, as-tu essayé de récupérer le texte en envoyant CTRL+A puis CTRL+C à la fenêtre ayant le focus ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 57
    Points : 53
    Points
    53
    Par défaut
    non.

    Si tu parles de faire le test pour savoir si on est sur la bonne fenêtre, j'ai fait un "CloseWindow" sur mon handle ce qui minimise bien ma fenêtre.

    Cela correspond à l'interrogation que tu posais?

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Non, non

    en envoyant CTRL + A suivi de CTRL + C à la fenêtre ayant le focus, tu devrais pouvoir récupérer le contenu dans le presse papier.

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par forgotten Voir le message
    j'ai essayé de récupérer aussi la position du curseur initial et final (pour la sélection de texte) mais je n'y arrive pas.
    Je crois que vous avez oublié la bonne méthode (normal puisque vous vous appellez forgotten).

    Citation Envoyé par Louis Griffont Voir le message
    Juste une question, as-tu essayé de récupérer le texte en envoyant CTRL+A puis CTRL+C à la fenêtre ayant le focus ?
    Cette méthode est pertinente (exactement celle que j'aurai donné) à l'exception du ctrl+A (qui permet de tout sélectionner automatiquement (mais je ne sais pas si c'est le but)).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 57
    Points : 53
    Points
    53
    Par défaut
    je n'ai pas fait ça non.


    voici l'ajout que je fais donc dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EnvoieTouche("^a",hwnd)
    EnvoieTouche("^c",hwnd)
    Trace(PressePapier())
    le résultat de ma trace est ce que contient ma fenêtre (blocnote)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 57
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Chakra9 Voir le message
    Je crois que vous avez oublié la bonne méthode (normal puisque vous vous appellez forgotten).
    très bon, on me l'a jamais faite

    Citation Envoyé par Chakra9 Voir le message
    Cette méthode est pertinente (exactement celle que j'aurai donné) à l'exception du ctrl+A (qui permet de tout sélectionner automatiquement (mais je ne sais pas si c'est le but)).
    Alléluia !!!

    effectivement, je n'y avais pas pensé, envoyer un CTRL-C fonctionne parfaitement


    mais cela suppose qu'on ait CTRL-C comme étant un raccourci pour faire un copier (raccourci de l'application).

    Disons que ça marchera dans 3/4 des cas, est-ce possible de le faire pour 100% des cas?

  8. #8
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    Bonjour,

    http://www.developpez.net/forums/d96...vers-variable/
    Si j'ai bien compris c'est un peu la même question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SendMessage(hWnd, WM_COPY, 0, 0)
    sTexte = PressePapier()
    http://www.developpez.net/forums/d96...e/#post5486921

  9. #9
    Membre confirmé
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Points : 492
    Points
    492
    Par défaut
    En complément d'Hibernatus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    S_POINT est une structure
    	x est un entier
    	y est un entier
    FIN
    ptCursor est un S_POINT
    API ("USER32","GetCursorPos",&ptCursor)
    HWndOver est un entier système = API ("USER32","WindowFromPoint",ptCursor)
    SendMessage(HWndOver, 0x0301, 0, 0)
    sWindowText est un Buffer = PressePapier()
    A+
    Vince

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 57
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Hibernatus34 Voir le message
    Bonjour,

    http://www.developpez.net/forums/d96...vers-variable/
    Si j'ai bien compris c'est un peu la même question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SendMessage(hWnd, WM_COPY, 0, 0)
    sTexte = PressePapier()
    http://www.developpez.net/forums/d96...e/#post5486921
    effectivement, c'était bien mon premier post.

    Je n'avais pas vu les nouvelles réponses

    en tout cas, ton code fonctionne à merveille, je l'ai modifié légèrement pour que ça corresponde à mon besoin.


    par contre, tu dis :
    Citation Envoyé par Hibernatus34 Voir le message
    Comme WM_GETTEXT ne marche pas sur la plupart des programmes récents (ça n'a marché que sur notepad quand j'ai testé), je me suis rabattu sur le presse-papier.
    c'est-à-dire que la solution que tu proposes donc est compatible avec n'importe quel programme (OS > Windows 2000) ou que les programmes récents sont incompatibles.

  11. #11
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    727
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 727
    Points : 1 646
    Points
    1 646
    Par défaut
    WM_GETTEXT sert normalement à récupérer tout le texte d'un champ.
    Ca marchait sur les champs standards car Microsoft avait pris soin de gérer le message, mais de nos jour les IHM se basent sur des champs plus évolués et pour lesquels on n'a pas implémenté la gestion de ce message.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 57
    Points : 53
    Points
    53
    Par défaut
    ok, je viens de tester ta solution et la solution d'envoyer un CTRL+C

    la seconde solution semble est plus démocratisée que la première car le CTRL+C est très souvent le raccourci pour faire un "copier".

    La premiere solution ne fonctionne pas sous I.E par exemple, ce qui m'est très gênant.

    Je te remercie néanmoins pour ton apport très instructif.

    Si tu as d'autres pistes je suis preneur, mais je pense que le CTRL-C restera la solution la plus démocratisée pour résoudre mon pb? étant donné que chaque éditeur de logiciel doit implémenter sa propre gestion des messages...

  13. #13
    Inactif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par forgotten Voir le message
    le CTRL-C restera la solution la plus démocratisée
    C'était ma solution, et j'ai toujours été démocratique .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/04/2014, 17h06
  2. Récupérer un message dans n'importe quelle langue
    Par macumba dans le forum Grails
    Réponses: 0
    Dernier message: 02/08/2011, 22h46
  3. Réponses: 0
    Dernier message: 29/08/2008, 14h45
  4. Coller du texte dans n'importe quelle application
    Par LapinEnSucre dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/03/2007, 10h31
  5. Réponses: 13
    Dernier message: 12/06/2006, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo