Handle d'un contrôle d'une fenêtre externe

Résolu
Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 - 11 mars 2014 à 15:23
Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 - 17 mars 2014 à 13:42
Bonjour à tous,

Idée générale.
À partir d'une application externe
app1
, développée sous WinDev et qui gère entre autre les équipements de l'entreprise, je peux lancer mon application
app2
, développée sous VB 2010 Express Edition et qui sert à géolocaliser l'équipement saisi (par son numéro) dans
app1
.

Problèmatique.
Bien que je sache comment récupérer le Handle de
app1
, je n'arrive pas à récupérer le texte indiquant le n° d'équipement afin de le copier dans
app2
.

Début de recherches.
D'après WinSpy++, ce champ est de classe Edit. Si ça dit quelque chose à quelqu'un. Mais une option dans
app1
me permet, étant admin, de connaitre le nom du champ et celui-ci n'apparaît pas dans WinSpy++ (aussi testé avec AutoIt 3).

J'ai bien trouvé la fonction FindWindowEx sur internet mais je ne suis pas à l'aise avec IntPtr qui reste encore obscure pour moi.
Ne comprenant pas FindWindowEx, je me tourne vers vous pour m'aiguiller vers une solution.

Merci d'avance... ;-)
--

8 réponses

Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 1
13 mars 2014 à 10:14
Personne n'a d'idée?

--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mars 2014 à 10:30
Bonjour,
Je ne suis pas VB.Nettiste, mais ta question concerne beaucoup plus les fonctions de l'Api de Windows que VB.Net.
je n'arrive pas à récupérer le texte indiquant le n° d'équipement
Pour que FindWindowsEx puisse récupérer ce texte, il te faut extraire le handle du contrôle qui le contient... et donc en connaître la classe exacte. Plusieurs contrôles de cette classe pouvant être présents dans la fenêtre concernée, il te faudra en plus (bien évidemment) t' "arrêter" sur celui qui t'intéresse. Il te faudra donc utiliser en plus la fonction GetWindowText de l'Api de Windows.
Tout cela est assez acrobatique, mais voilà : tu as les grandes lignes à suivre. A toi de jouer ...
0
Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 1
Modifié par Shaegal le 13/03/2014 à 11:08
Merci ucfoutu,

Pas mal d'exemples existent sur internet mais peu donnent d'explications sur GetWindowsText qui pourraient m'aider à adapter les exemples à mon cas. En plus, comme sité plus haut, je suis peu à l'aise avec IntPtr, indispensable à l'utilisation de GetWindowsText.

Lorsque j'utilise WinSpy++, la classe du contrôle est "Edit" mais ne me donne pas le "name" du contrôle. Je me vois donc obligé de faire une boucle sur tous les contrôles de classe "Edit" sans vraiment savoir lequel est le bon.
Avec WinSpy++ sur un contrôle d'une application VB, j'ai, et la classe, et le name du contrôle.

Si tu vois d'autres suggestions, n'hésite pas à me les dire... ;-)
--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mars 2014 à 12:43
Ne jamais, dans ce cas, se "frotter" à ce que l'on ne maîtrise pas vraiment. Tel est mon conseil (je suis vieux, moi ...)
0

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

Posez votre question
Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 1
13 mars 2014 à 13:20
Si je ne me "frotte" pas à ce que je ne connais pas, comment pourrais-je progresser? Avancer dans la vie par le dépassement de soi est ce qu'il y a de plus gratifiant, foi d'un pas si jeune que ça. ;-)
Mais avancer peut parfois se faire avec l'aide d'autrui.

Mais ce n'est pas ici que l'on doit débattre de ce qui fait avancer.

Je progresse avec GetWindowsText mais je n'arrive pas à passer d'un contrôle à un autre. Sais-tu comment faire?

--
0
Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 1
17 mars 2014 à 12:11
Mission accomplie. Pour celles et ceux que ça intéresse, voici un bout de code utilisé pour un titre de fenêtre qui ne change jamais:

Imports System.Runtime.InteropServices

Public Class Form1
  Private Const WM_GETTEXT As Integer = &HD
  Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, _
  ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim oWindow As IntPtr = FindWindowByCaption(IntPtr.Zero, "Titre fenêtre")
    Dim Childrens As IntPtr() = GetChildWindows(oWindow)

    Dim Handle As IntPtr = Marshal.AllocHGlobal(100)
    'Dans mon cas, PositionDuContrôle=47
    Dim NumText As Integer = SendMessage(Childrens(PositionDuContrôle), WM_GETTEXT, 50, Handle)
    'Récupération du texte du contrôle!
    TextBox1.Text=Marshal.PtrToStringUni(Handle)
  End Sub


Il y a des choses qu'on ne peut inventer et, est-il utile de réinventer ce qui l'est déjà?

Quoique t'en dises, merci car c'est bien grâce à toi, ucfoutu, que j'ai pu résoudre mon problème en me mettant sur la bonne voie... ;-)

--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 mars 2014 à 12:54
Et maintenant un "+1" !!!
Je l'ai enlevé moi-même, pardi ! ===>> on ne met pas un + 1 pour du si ... évident ...
0
Shaegal Messages postés 110 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 12 mai 2021 1
17 mars 2014 à 13:42
Évident? Pour qui? Pas pour moi en tout cas, qui n'est qu'un modeste autodidacte, et sans doute pour bien d'autres qui seront heureux de découvrir qu'il existe une solution à ce problème.

À bientôt... ;-)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 13/03/2014 à 14:47
Avancer dans la vie par le dépassement de soi est ce qu'il y a de plus gratifiant
Hé bien alors : progresse donc ety dépasse-toi donc ...
Mais avancer peut parfois se faire avec l'aide d'autrui.

et je t'ai mis sur la voie ! A moins que "progresser" n'ait pour toi le sens de "copier/coller"
Mais ce n'est pas ici que l'on doit débattre de ce qui fait avancer
Tu as raison , en effet. Raison pour laquelle je quitte d'ailleurs sagement cette discussion en te souhaitant bonne chance.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
-1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 13/03/2014 à 17:51
Ah ! Je suppose que le -1 correspond au fait que tu n'as pas obtenu ton "tout-cuit", mais uniquement la voie à suivre..
Bien .

PS : Je complète malgré tout ma "mise sur la voie" (et pas au-delà, maintenant, d'autant que je ne suis pas vb.nettiste (je te le rappelle).)
Il va te falloir énumérer toutes les fenêtres enfants ===>>> Fonction EnumChildWindows de la librairie User32 de l'Api de Windows (appelée bien évidemment en callback).
0
Le -1 correspond uniquement à ton manque de discernement sur moi. Ou as-vu que je voulais du copier/coller, du "tout-cuit"? Je me sens insulté.
Si tu avais cherché un peu, juste en cliquant sur mon pseudo, tu aurais pu voir que je recherche le savoir, la connaissance, comprendre. On apprend pas avec du copier/coller ou du "tout-cuit".

Quant à tes aides, elles m'ont toujours été utiles et à celles-ci, j'y mets parfois +1. Et cette dernière est utile car je ne connaissais pas EnumChildWindows. Je l'essaierai demain et peut-être y ajouterai-je 1.

Merci à toi.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mars 2014 à 20:39
Ne me remercie pas et continue ton chemin.
Tu as tes choix et habitudes. J'ai les miens. Voilà tout.
0
Rejoignez-nous