Handle d'un contrôle d'une fenêtre externe [Résolu]

Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
- - Dernière réponse : Shaegal
Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
- 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... ;-)
--
Afficher la suite 

Votre réponse

8 réponses

Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
0
Merci
Personne n'a d'idée?

--
Commenter la réponse de Shaegal
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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 ...
Commenter la réponse de ucfoutu
Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
0
Merci
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... ;-)
--
Commenter la réponse de Shaegal
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Ne jamais, dans ce cas, se "frotter" à ce que l'on ne maîtrise pas vraiment. Tel est mon conseil (je suis vieux, moi ...)
Commenter la réponse de ucfoutu
Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
0
Merci
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?

--
Commenter la réponse de Shaegal
Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
0
Merci
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... ;-)

--
Commenter la réponse de Shaegal
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Et maintenant un "+1" !!!
Je l'ai enlevé moi-même, pardi ! ===>> on ne met pas un + 1 pour du si ... évident ...
Shaegal
Messages postés
117
Date d'inscription
vendredi 1 février 2008
Dernière intervention
21 mars 2018
-
É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... ;-)
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-1
Merci
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
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
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).
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.
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Ne me remercie pas et continue ton chemin.
Tu as tes choix et habitudes. J'ai les miens. Voilà tout.
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.