Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

API Windows EnumChildWindows

1 réponse
Avatar
Pyroa
Bonjour,

J'ai trouv=E9 le code exemple suivant :

Private Declare Function EnumWindows Lib "user32" (ByVal
lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal
hWndParent As _
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

' The following variables are shared between the main ChildWindows
procedure
' and the auxiliary (private) ChildWindows_CBK routine

' An array of Long holding the handle of all child windows.
Dim windows() As Long
' The number of elements in the array.
Dim windowsCount As Long

' Return an array of Long holding the handles of all the child
windows
' of a given window. If hWnd =3D 0 it returns all the top-level
windows.

Function ChildWindows(ByVal hWnd As Long) As Long()
windowsCount =3D 0
If hWnd Then
EnumChildWindows(hWnd, AddressOf EnumWindows_CBK, 1)
Else
EnumWindows(AddressOf EnumWindows_CBK, 1)
End If
' Trim uninitialized elements and return to caller.
ReDim Preserve windows(windowsCount) As Long
ChildWindows =3D windows()
End Function

' The callback routine, common to both EnumWindows and
EnumChildWindows.

Private Function EnumWindows_CBK(ByVal hWnd As Long, ByVal lParam
As Long) As _
Long
' Make room in the array, if necessary.
If windowsCount =3D 0 Then
ReDim windows(100) As Long
ElseIf windowsCount >=3D UBound(windows) Then
ReDim Preserve windows(windowsCount + 100) As Long
End If
' Store the new item.
windowsCount =3D windowsCount + 1
windows(windowsCount) =3D hWnd
' Return 1 to continue enumeration.
EnumWindows_CBK =3D 1
End Function


Mais lorsque je le colle dans une application Windows de test, ces
deux lignes sont soulign=E9s :

EnumChildWindows(hWnd, AddressOf EnumWindows_CBK, 1)
EnumWindows(AddressOf EnumWindows_CBK, 1)

indiquant les erreurs suivantes :

Overload resolution failed because no accessible 'EnumChildWindows'
can be called with these arguments:
'Declare Ansi Function EnumChildWindows Lib "user32"(hWndParent As
Long, lpEnumFunc As Long, lParam As Long) As Long': 'AddressOf'
expression cannot be converted to 'Long' because 'Long' is not a
delegate type.
'Declare Ansi Function EnumChildWindows Lib "user32"(hwndParent As
Integer, lpEnumFunc As Integer, lParam As Integer) As Integer':
'AddressOf' expression cannot be converted to 'Integer' because
'Integer' is not a delegate type.

Pour la premiere ligne et,

'AddressOf' expression cannot be converted to 'Long' because 'Long' is
not a delegate type.

Pour la deuxi=E8me ligne.

Il me semblait pourtant que AddressOf =E9tait l'=E9quivalent d'un pointeur
de fonction, et que par cons=E9quent il renvoyait l'adresse d'une
fonction sous forme d'un long.

Comment r=E9soudre ce probl=E8me ?

Pour information je suis sous Visual Studio 2005 et Windows 2000.

Merci d'avance pour vos r=E9ponses.

1 réponse

Avatar
Patrice
EN VB.NET cela retourne un Delegate (effectivement un pointeur de fonction
mais exposé sous forme d'un objet, pas directement la valeur elle-même).
Egalement :
- Long devient Integer en VB.NET
- Pour les handles, on utilise généralement IntPtr

Plus généralement voir ce site :

http://www.pinvoke.net/default.aspx/user32/EnumChildWindows.html

--
Patrice

a écrit dans le message de groupe de discussion :

Bonjour,

J'ai trouvé le code exemple suivant :

Private Declare Function EnumWindows Lib "user32" (ByVal
lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Private Declare Function EnumChildWindows Lib "user32" (ByVal
hWndParent As _
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

' The following variables are shared between the main ChildWindows
procedure
' and the auxiliary (private) ChildWindows_CBK routine

' An array of Long holding the handle of all child windows.
Dim windows() As Long
' The number of elements in the array.
Dim windowsCount As Long

' Return an array of Long holding the handles of all the child
windows
' of a given window. If hWnd = 0 it returns all the top-level
windows.

Function ChildWindows(ByVal hWnd As Long) As Long()
windowsCount = 0
If hWnd Then
EnumChildWindows(hWnd, AddressOf EnumWindows_CBK, 1)
Else
EnumWindows(AddressOf EnumWindows_CBK, 1)
End If
' Trim uninitialized elements and return to caller.
ReDim Preserve windows(windowsCount) As Long
ChildWindows = windows()
End Function

' The callback routine, common to both EnumWindows and
EnumChildWindows.

Private Function EnumWindows_CBK(ByVal hWnd As Long, ByVal lParam
As Long) As _
Long
' Make room in the array, if necessary.
If windowsCount = 0 Then
ReDim windows(100) As Long
ElseIf windowsCount >= UBound(windows) Then
ReDim Preserve windows(windowsCount + 100) As Long
End If
' Store the new item.
windowsCount = windowsCount + 1
windows(windowsCount) = hWnd
' Return 1 to continue enumeration.
EnumWindows_CBK = 1
End Function


Mais lorsque je le colle dans une application Windows de test, ces
deux lignes sont soulignés :

EnumChildWindows(hWnd, AddressOf EnumWindows_CBK, 1)
EnumWindows(AddressOf EnumWindows_CBK, 1)

indiquant les erreurs suivantes :

Overload resolution failed because no accessible 'EnumChildWindows'
can be called with these arguments:
'Declare Ansi Function EnumChildWindows Lib "user32"(hWndParent As
Long, lpEnumFunc As Long, lParam As Long) As Long': 'AddressOf'
expression cannot be converted to 'Long' because 'Long' is not a
delegate type.
'Declare Ansi Function EnumChildWindows Lib "user32"(hwndParent As
Integer, lpEnumFunc As Integer, lParam As Integer) As Integer':
'AddressOf' expression cannot be converted to 'Integer' because
'Integer' is not a delegate type.

Pour la premiere ligne et,

'AddressOf' expression cannot be converted to 'Long' because 'Long' is
not a delegate type.

Pour la deuxième ligne.

Il me semblait pourtant que AddressOf était l'équivalent d'un pointeur
de fonction, et que par conséquent il renvoyait l'adresse d'une
fonction sous forme d'un long.

Comment résoudre ce problème ?

Pour information je suis sous Visual Studio 2005 et Windows 2000.

Merci d'avance pour vos réponses.