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

Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 11 mars 2014 à 15:23 - Dernière réponse : Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention
- 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 

12 réponses

Répondre au sujet
Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 13 mars 2014 à 10:14
0
Utile
Personne n'a d'idée?

--
Commenter la réponse de Shaegal
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 13 mars 2014 à 10:30
0
Utile
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
Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention - Modifié par Shaegal le 13/03/2014 à 11:08
0
Utile
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 13 mars 2014 à 12:43
0
Utile
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
Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 13 mars 2014 à 13:20
0
Utile
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
Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 17 mars 2014 à 12:11
0
Utile
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 17 mars 2014 à 12:54
0
Utile
1
Et maintenant un "+1" !!!
Je l'ai enlevé moi-même, pardi ! ===>> on ne met pas un + 1 pour du si ... évident ...
Shaegal 117 Messages postés vendredi 1 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 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... ;-)
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 13/03/2014 à 14:47
-1
Utile
3
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 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 13 mars 2014 à 17:04
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 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 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.
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.