Probleme Findwindowex

Résolu
AirByte Messages postés 13 Date d'inscription mercredi 5 janvier 2011 Statut Membre Dernière intervention 25 février 2011 - 7 janv. 2011 à 15:29
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 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

7 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
10 janv. 2011 à 20:24
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.

@++
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
7 janv. 2011 à 18:42
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.

@++
0
AirByte Messages postés 13 Date d'inscription mercredi 5 janvier 2011 Statut Membre Dernière intervention 25 février 2011
7 janv. 2011 à 18:59
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?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
7 janv. 2011 à 20:38
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 ?

@++
0

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

Posez votre question
AirByte Messages postés 13 Date d'inscription mercredi 5 janvier 2011 Statut Membre Dernière intervention 25 février 2011
10 janv. 2011 à 14:05
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.
0
AirByte Messages postés 13 Date d'inscription mercredi 5 janvier 2011 Statut Membre Dernière intervention 25 février 2011
10 janv. 2011 à 16:53
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..
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
10 janv. 2011 à 20:11
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.

@++
0
Rejoignez-nous