OVH Cloud OVH Cloud

VBA. Pb pour récupérer une donnée...

5 réponses
Avatar
HD
Bonjour,

J'énumère par une fonction la liste des fenêtres Windows actives et lorsque
une correspond à mes critères je récupère son nom par une variable << NomF
>>... Le problème est que si je mets NomF en Global ou en Publi je ne
parvient pas à récupérer la donnée... Alors que par contre la fonction
LEnumWindowsProc me trouve bien une fenêtre correspondant à mes critères...

Voici ma fonction :

Global NomF As String

Private Function LEnumWindowsProc&(ByVal hwnd&, ByVal lParam&)
Dim SLength&, Buffer As String, RetVal&
Dim NomFtmp As String

NomF = ""
NomFtmp = ""
SLength = GetWindowTextLength(hwnd) + 1
If SLength > 1 Then
Buffer = Space(SLength)
RetVal = GetWindowText(hwnd, Buffer, SLength)
If CBool(IsWindowVisible(hwnd)) = True Then
NomFtmp = Left(Buffer, SLength - 1)
If Len(NomFtmp) > 4 Then
If IsNumeric(Right(NomFtmp, 4)) Then
NomF = Left(NomFtmp, Len(NomFtmp) - 4)
MsgBox NomF ' ici la donnée apparait bien
End If
End If
End If
End If
LEnumWindowsProc = 1
End Function

Sub WinList()
EnumWindows AddrOf("LEnumWindowsProc"), 0
MsgBox NomF 'la donnée a retrouvée sa valeur vide.... :-(
End Sub

Merci d'avance pour votre aide
--
@+
HD

5 réponses

Avatar
Michel Pierron
Bonjour HD;
Bah oui, si tu ne sors pas de la boucle quand tu as trouvé ton fichier,
l'énumération continue avec NomF="" que tu as réinitialisé dans ta fonction
Function LEnumWindowsProc. Il faudrait un coup de pot pour que la fenêtre
cherchée soit la dernière de la liste. Soit tu ne mets pas NomF dans la
boucle, mais la sortie ne se fait pas quand tu as trouvé une valeur et si tu
en as plusieurs qui répondent aux conditions, c'est la dernière qui est
sauvegardée dans ta variable NomF qui doit être Public (Global, c'est pour
les versions antédiluviennes), soit tu inclus un paramètre de sortie quand
la condition est trouvée (i& qui passe à 0 et provoque la sortie).

Public NomF As String

Private Function LEnumWindowsProc&(ByVal hwnd&, ByVal lParam&)
Dim SLength&, Buffer As String, RetVal&
Dim NomFtmp As String, i&
NomF = "": NomFtmp = "": i = 1
SLength = GetWindowTextLength(hwnd) + 1
If SLength > 1 Then
Buffer = Space(SLength)
RetVal = GetWindowText(hwnd, Buffer, SLength)
If CBool(IsWindowVisible(hwnd)) = True Then
NomFtmp = Left(Buffer, SLength - 1)
If Len(NomFtmp) > 4 Then
If IsNumeric(Right(NomFtmp, 4)) Then
NomF = Left(NomFtmp, Len(NomFtmp) - 4)
'MsgBox NomF ' ici la donnée apparait bien
i = 0
End If
End If
End If
End If
LEnumWindowsProc = i
End Function

MP

"HD" a écrit dans le message de news:
dccrop$1rdk$
Bonjour,

J'énumère par une fonction la liste des fenêtres Windows actives et
lorsque

une correspond à mes critères je récupère son nom par une variable << NomF
... Le problème est que si je mets NomF en Global ou en Publi je ne
parvient pas à récupérer la donnée... Alors que par contre la fonction


LEnumWindowsProc me trouve bien une fenêtre correspondant à mes
critères...


Voici ma fonction :

Global NomF As String

Private Function LEnumWindowsProc&(ByVal hwnd&, ByVal lParam&)
Dim SLength&, Buffer As String, RetVal&
Dim NomFtmp As String

NomF = ""
NomFtmp = ""
SLength = GetWindowTextLength(hwnd) + 1
If SLength > 1 Then
Buffer = Space(SLength)
RetVal = GetWindowText(hwnd, Buffer, SLength)
If CBool(IsWindowVisible(hwnd)) = True Then
NomFtmp = Left(Buffer, SLength - 1)
If Len(NomFtmp) > 4 Then
If IsNumeric(Right(NomFtmp, 4)) Then
NomF = Left(NomFtmp, Len(NomFtmp) - 4)
MsgBox NomF ' ici la donnée apparait bien
End If
End If
End If
End If
LEnumWindowsProc = 1
End Function

Sub WinList()
EnumWindows AddrOf("LEnumWindowsProc"), 0
MsgBox NomF 'la donnée a retrouvée sa valeur vide.... :-(
End Sub

Merci d'avance pour votre aide
--
@+
HD






Avatar
HD
Bah oui, si tu ne sors pas de la boucle quand tu as trouvé ton fichier,
l'énumération continue avec NomF="" que tu as réinitialisé dans ta
fonction

Function LEnumWindowsProc. Il faudrait un coup de pot pour que la fenêtre
cherchée soit la dernière de la liste. Soit tu ne mets pas NomF dans la
boucle, mais la sortie ne se fait pas quand tu as trouvé une valeur et si
tu

en as plusieurs qui répondent aux conditions, c'est la dernière qui est
sauvegardée dans ta variable NomF qui doit être Public (Global, c'est pour
les versions antédiluviennes), soit tu inclus un paramètre de sortie quand
la condition est trouvée (i& qui passe à 0 et provoque la sortie).


Effectivement ta fonction tourne... Mais je ne vois pas où est la boucle ?
Il n'y pas de do, de next ou autres...

--
@+
HD

Avatar
Michel Pierron
Re HD;

La boucle est initialisée par l'appel à la DLL EnumWindows que tu exécutes
dans ta procédure Sub WinList.
Tant que la fonction LEnumWindowsProc est True (1) et que l'arguement
retourné hwnd est <> 0, le processus est itératif. Le processus s'arrête
soit parce que l'argument hwnd est égal à 0 (cas où toute la liste des
fenêtres a été explorée), soit parce que la fonction LEnumWindowsProc est
False (0) quand tu as trouvé ce que tu cherchais.

MP


"HD" a écrit dans le message de news:
dcd5pr$1vqm$
Bah oui, si tu ne sors pas de la boucle quand tu as trouvé ton fichier,
l'énumération continue avec NomF="" que tu as réinitialisé dans ta
fonction

Function LEnumWindowsProc. Il faudrait un coup de pot pour que la
fenêtre


cherchée soit la dernière de la liste. Soit tu ne mets pas NomF dans la
boucle, mais la sortie ne se fait pas quand tu as trouvé une valeur et
si


tu
en as plusieurs qui répondent aux conditions, c'est la dernière qui est
sauvegardée dans ta variable NomF qui doit être Public (Global, c'est
pour


les versions antédiluviennes), soit tu inclus un paramètre de sortie
quand


la condition est trouvée (i& qui passe à 0 et provoque la sortie).


Effectivement ta fonction tourne... Mais je ne vois pas où est la boucle ?
Il n'y pas de do, de next ou autres...

--
@+
HD





Avatar
HD
La boucle est initialisée par l'appel à la DLL
EnumWindows que tu exécutes dans ta
procédure Sub WinList.


Comment as tu accès à toutes ces descriptions de DLL ?
--
@+
HD

Avatar
Michel Pierron
Bonsoir HD;
Dans le cas présent, je dirais que c'est pratiquement implicite ou bien,
c'est l'expérience.
Tu peux télécharger une liste presque exhaustive des API (avec exemples) en
anglais ici:
http://users.chello.be/cr27630/3.7/agsetup.exe
C'est la plus complète que je connaisse.

MP

"HD" a écrit dans le message de news:
dckha7$25ks$
La boucle est initialisée par l'appel à la DLL
EnumWindows que tu exécutes dans ta
procédure Sub WinList.


Comment as tu accès à toutes ces descriptions de DLL ?
--
@+
HD