OVH Cloud OVH Cloud

VBA. Avoir la liste des fenêtre Windows ouvertes

22 réponses
Avatar
HD
Bonjour,

Comment puis-je, en VBA, obtenir la liste des fenêtres Windows ouvertes?

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

10 réponses

1 2 3
Avatar
Michel Pierron
Bonjour Frédéric;
Cette procédure retourne la liste des process actifs, mais ne donne pas le nom des
fenêtres associées comme le demande HD.
MP

"Frédéric Sigonneau" <frédé a écrit dans le message de
news:
Bonsoir,

Une solution qui ne dépend pas, en principe, de ta version d'Excel :

Sub ProcessusActifs()
Dim strComputer, objWMIServices, colProcesses, objProcess

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")
Workbooks.Add
For Each objProcess In colProcesses
i = i + 1
Cells(i, "a").Value = objProcess.Name
Next

End Sub

Par contre, dépend de ta version de Windows. Les scripts WMI sont 'de base' avec
Windows 2000, XP, 2003. Pour en disposer avec Windows 98 et NT 4 :

http://www.microsoft.com/technet/scriptcenter/scrptfaq.asp

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

HD a écrit:
Bonjour,

Comment puis-je, en VBA, obtenir la liste des fenêtres Windows ouvertes?

Merci d'avance pour votre aide.





Avatar
Frédéric Sigonneau
Salut Michel,

Tu as raison, je suis un peu HS sur ce coup :)
Il y a sans doute une propriété des objets de classe Win32_Process qui permet de
contrôler si un processus est visible ou non et le nom de sa fenêtre s'il est
visible, mais je n'ai pas trouvé pour l'instant. Je découvre un peu la
manipulation de ces objets à vrai dire et je les trouve intéressants, mais je
suis encore en phase d'apprentissage..
A l'occasion, je transmettrai une réponse + complète.

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Michel Pierron a écrit:
Bonjour Frédéric;
Cette procédure retourne la liste des process actifs, mais ne donne pas le nom des
fenêtres associées comme le demande HD.
MP

"Frédéric Sigonneau" <frédé a écrit dans le message de
news:

Bonsoir,

Une solution qui ne dépend pas, en principe, de ta version d'Excel :

Sub ProcessusActifs()
Dim strComputer, objWMIServices, colProcesses, objProcess

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")
Workbooks.Add
For Each objProcess In colProcesses
i = i + 1
Cells(i, "a").Value = objProcess.Name
Next

End Sub

Par contre, dépend de ta version de Windows. Les scripts WMI sont 'de base' avec
Windows 2000, XP, 2003. Pour en disposer avec Windows 98 et NT 4 :

http://www.microsoft.com/technet/scriptcenter/scrptfaq.asp

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

HD a écrit:

Bonjour,

Comment puis-je, en VBA, obtenir la liste des fenêtres Windows ouvertes?

Merci d'avance pour votre aide.









Avatar
Frédéric Sigonneau
Salut Michel,

Tu as raison, je suis un peu HS sur ce coup :)
Il y a peut-être une propriété des objets de classe Win32_Process qui permet de
contrôler si un processus est visible ou non et le nom de sa fenêtre s'il est
visible, mais je n'ai pas trouvé pour l'instant. Je découvre un peu la
manipulation de ces objets à vrai dire et je les trouve intéressants, mais je
suis encore en phase d'apprentissage...
A l'occasion, je transmettrai une réponse + adaptée.

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

Michel Pierron a écrit:
Bonjour Frédéric;
Cette procédure retourne la liste des process actifs, mais ne donne pas le
nom des

fenêtres associées comme le demande HD.
MP

"Frédéric Sigonneau" <frédé a écrit dans le message de
news:

Bonsoir,

Une solution qui ne dépend pas, en principe, de ta version d'Excel :

Sub ProcessusActifs()
Dim strComputer, objWMIServices, colProcesses, objProcess

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")
Workbooks.Add
For Each objProcess In colProcesses
i = i + 1
Cells(i, "a").Value = objProcess.Name
Next

End Sub

Par contre, dépend de ta version de Windows. Les scripts WMI sont 'de base' avec
Windows 2000, XP, 2003. Pour en disposer avec Windows 98 et NT 4 :

http://www.microsoft.com/technet/scriptcenter/scrptfaq.asp

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !

HD a écrit:

Bonjour,

Comment puis-je, en VBA, obtenir la liste des fenêtres Windows ouvertes?

Merci d'avance pour votre aide.









Avatar
HD
AddressOf est inconnu dans xl97.


Je suis justement en Excel 97...
--
@+
HD

Avatar
HD
Ne serait-il pas pertinent de charger la librairie :
Microsoft Forms 2.0 Object Library


Cette référence est bien activée... d'ailleurs si elle ne l'avait pas été le
message d'erreur aurait été tout autre...
--
@+
HD

Avatar
Michel Pierron
Bonjour HD;
Pour Excel97:
Ajouter en tête du module:
Private Declare Function GetCurrentVbaProject Lib "vba332.dll" _
Alias "EbGetExecutingProj" (hProject As Long) As Long
Private Declare Function GetFuncID Lib "vba332.dll" Alias _
"TipGetFunctionId" (ByVal hProject As Long, ByVal strFunctionName _
As String, ByRef strFunctionID As String) As Long
Private Declare Function GetAddr Lib "vba332.dll" Alias _
"TipGetLpfnOfFunctionId" (ByVal hProject As Long, ByVal strFunctionID _
As String, ByRef lpfnAddressOf As Long) As Long

Ajouter la fonction:
'* AddressOf operator replacement for Office97 VBA
'* Authors: Ken Getz and Michael Kaplan
Function AddrOf(CallbackFunctionName As String) As Long
Dim aResult As Long, CurrentVBProject As Long, strFunctionID As String
Dim AddressOfFunction As Long, UnicodeFunctionName As String
'* convert the name of the function to Unicode system
UnicodeFunctionName = StrConv(CallbackFunctionName, vbUnicode)
'* if the current VBProjects exists...
If Not GetCurrentVbaProject(CurrentVBProject) = 0 Then
'* ...get the function ID of the callback function, based on its
'* unicode-converted name, in order to ensure that it exists
aResult = GetFuncID(hProject:=CurrentVBProject, _
strFunctionName:=UnicodeFunctionName, strFunctionID:=strFunctionID)
'* if the function exists indeed ...
If aResult = 0 Then
' *...get a pointer to the callback function based on
'* the strFunctionID argument of the GetFuncID function
aResult = GetAddr(hProject:=CurrentVBProject, _
strFunctionID:=strFunctionID, lpfnAddressOf:­dressOfFunction)
'* if we've got the pointer pass it to the result of the function
If aResult = 0 Then AddrOf = AddressOfFunction
End If
End If
End Function

Remplacer dans Sub WinList():
EnumWindows AddressOf EnumWindowsProc, 0
Par
EnumWindows AddrOf("EnumWindowsProc"), 0

MP

"HD" a écrit dans le message de
news:c5o5mt$2c85$
AddressOf est inconnu dans xl97.


Je suis justement en Excel 97...
--
@+
HD





Avatar
HD
Merci Michel !!! ça fonctionne du tonnerre !!!

Je ne connaissais pas ces fenêtres invisibles... quel est l'intérêt de faire
des fenêtres invisibles? Et peut on les rendre visible par curioité?

Merci.

--
@+
HD
Avatar
HD
Et comment peut on mettre le focus sur une fenêtre dont on connait le nom?
--
@+
HD
Avatar
Michel Pierron
Re HD;
Pour la question 1:
Oui, c'est possible mais à manier avec précaution car certaines fenêtres masquées
ne peuvent volontairement être affichées.
L'intérêt par exemple, ce sont les fenêtres placées dans le Systray en bas à
droite de l'écran.
Je t'ai envoyé un fichier exemple en bal perso.
Pour la question 2:
Il te faut retrouver d'abord le handle de la fenêtre
hWnd = FindWindow(vbNullString, "Ici le titre de la fenêtre")
Déclarer la fonction suivante en tête de module
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As
Long
et utiliser l'instruction:
BringWindowToTop hWnd
Ou en une seule instruction:
BringWindowToTop FindWindow(vbNullString, "Ici le titre de la fenêtre")

MP

"HD" a écrit dans le message de
news:
Et comment peut on mettre le focus sur une fenêtre dont on connait le nom?
--
@+
HD




Avatar
HD
BringWindowToTop FindWindow(vbNullString, "Ici le titre de la
fenêtre")


Le focus apparaît et disparait aussi tôt...
--
@+
HD

1 2 3