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 :
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 :
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.
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
<Pyroa@orange.fr> a écrit dans le message de groupe de discussion :
c037d4d9-3651-49de-a9f0-e867e18f2b8f@d45g2000hsc.googlegroups.com...
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 :
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.
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
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 :
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.