Probleme Findwindowex [Résolu]

AirByte 13 Messages postés mercredi 5 janvier 2011Date d'inscription 25 février 2011 Dernière intervention - 7 janv. 2011 à 15:29 - Dernière réponse : cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention
- 10 janv. 2011 à 20:24
Bonjour

J'essaie d'utiliser FindWindowex pour récupérer un handle-enfant d'une fenêtre. Avec certaine fenêtre ça fonctionne mais avec celle qui m'intéresse ça me retourne constamment 0.

Voici mon code
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpclassname As String, ByVal lpclasswindowname As String) As Int32

    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As Int32

    Private Declare Function GetWindowTextA Lib "user32" (ByVal hWnd As Int32, ByVal lpString As String, ByVal cch As Int32) As Int32

    Private Sub Main()


        Dim hWndParent As Integer
        Dim hWndChild As Integer

        ' trouve la fenêtre
        hWndParent = FindWindow("AfxFrameOrView70u", "Rapports de l'agent")
        MsgBox(hWndParent, vbOKOnly, hWndParent)

        ' trouve le contrôle "AfxWnd70u"
        hWndChild = FindWindowEx(hWndParent, 0, "AfxWnd70u", vbNullString)
        MsgBox(hWndChild, vbOKOnly, hWndChild)


Et voici les infos récupérer avec un tool de AUTOIT:

>>>> Window <<<<
Title: Rapports de l'agent
Class: AfxFrameOrView70u
Position: 909, 796
Size: 397, 143
Style: 0x14CFC000
ExStyle: 0x00000108
Handle: 0x003E06CA

>>>> Control <<<<
Class: AfxWnd70u
Instance: 4
ClassnameNN: AfxWnd70u4
Name:
Advanced (Class): [CLASS:AfxWnd70u; INSTANCE:4]
ID: 3
Text:
Position: 2, 50
Size: 150, 27
ControlClick Coords: 38, 8
Style: 0x50000000
ExStyle: 0x00000000
Handle: 0x001C0B3A

On voit bien qu'un no. de Handle est attribué au controle, mais comment le récupéré? Ou est mon erreur? Je récupère bien le HwndParent mais pas le hwndchild.

Merci
Afficher la suite 

7 réponses

Répondre au sujet
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 10 janv. 2011 à 20:24
+3
Utile
Il faudra que tu verifie si la condition d'arrêt est NULL ou le handle du premier enfant trouvé. (Je ne sais pas si ça tourne en boucle ou pas GW_HWNDNEXT).

En fait, tu peux faire comme tu l'entends car je pense que de toutes manières, la recherche sera liée à l'interface étant donné que la classe pourrait être utilisée plusieurs fois dans l'arbre d'une même fenêtre principale.

@++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_patatalo
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 7 janv. 2011 à 18:42
0
Utile
salut,


le premier truc qui me vient serait vbNullString à remplacer par 0 car un pointeur vers une chaine nulle n'est pas la même chose qu'un pointeur nul.

@++
Commenter la réponse de cs_patatalo
AirByte 13 Messages postés mercredi 5 janvier 2011Date d'inscription 25 février 2011 Dernière intervention - 7 janv. 2011 à 18:59
0
Utile
bonjour, merci pour cette réponse

J'ai remplacé par 0, vbNull, nothing.
Rien a faire. HwndChild a toujours la valeur 0

Je me demande s'il n'y a pas certain control dont le handle est irrécupérable.

D'autre idée?
Commenter la réponse de AirByte
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 7 janv. 2011 à 20:38
0
Utile
ce qui est possible, c'est que ton handle ne soit pas un descendant direct de la fenêtre principale et que la fonction ne cherche que ceux-ci.

hWndParent = FindWindow("AfxFrameOrView70u", "Rapports de l'agent")
MsgBox(hWndParent, vbOKOnly, hWndParent)

hWndChild = GetWindow(hWndParent, GW_CHILD)
MsgBox(hWndChild, vbOKOnly, hWndChild)

avec GetWindow(), ça donne quoi ?

@++
Commenter la réponse de cs_patatalo
AirByte 13 Messages postés mercredi 5 janvier 2011Date d'inscription 25 février 2011 Dernière intervention - 10 janv. 2011 à 14:05
0
Utile
Bonjour

Génial, j'ai un résultat. J'ai du faire une petite recherche sur le GetWindows, je ne suis pas très familier avec les APIs.

Mon autre problème maintenant, c'est d'exploiter ce résultat. Cette "Fenêtre Fille" est un genre d'entête de colonne dont je dois récupérer le récupérer le texte.

Je vais travailler la dessus, si tu veux m'en dire plus sur la façon d'utiliser le résultat ou me référer a un bon site ça serait apprécié.

Merci beaucoup et longue vie à ce forum.
Commenter la réponse de AirByte
AirByte 13 Messages postés mercredi 5 janvier 2011Date d'inscription 25 février 2011 Dernière intervention - 10 janv. 2011 à 16:53
0
Utile
Bonjour,

J'avais pas remarquer tout de suite, mais le GW_CHILD retourne comme valeur la première fenêtre fille!

J'aurais besoin de la 4ieme (je crois).
comment puis-je faire?

Si je répète le GetWindow, il semble chercher la fenêtre fille de la fenêtre fille etc..
Commenter la réponse de AirByte
cs_patatalo 1466 Messages postés vendredi 2 janvier 2004Date d'inscription 14 février 2014 Dernière intervention - 10 janv. 2011 à 20:11
0
Utile
re,

tu as GW_HWNDNEXT, GW_HWNDPREV, ... Tape le nom de la fonction dans le moteur de recherche et tu auras son fonctionnement.

GetClassName() permettra de retourner le nom de la classe afin de comparer avec celui qui t'interesse.

Dans ce cas, je te conseillerais plutôt de mettre en place EnumChildWindow() pour chaque enfant trouvé car le handle que tu recherche pourrait être n'importe où. Il faut scanner l'arbre des handles.

Il serait dommage de changer le programme à chaque changement de l'interface.

@++
Commenter la réponse de cs_patatalo

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.