Lister tous les processus en cours
Declare Function cherche_fenetre Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Declare Function get_titre Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Declare Function SendMessage_ Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Function classe(pointeur) As String 'classe de la fenetre
classe = String(100, Chr$(0))
GetClassName pointeur, classe, 100
classe = Left$(classe, InStr(classe, Chr$(0)) - 1)
End Function
Function titre(pointeur) As String 'titre du document
titre = String(100, Chr$(0))
get_titre pointeur, titre, 100
titre = Left$(titre, InStr(titre, Chr$(0)) - 1)
End Function
Function titre2(pointeur) As String 'texte titre fenetre
titre2 = String(100, Chr$(0))
nbcar = SendMessage_(pointeur, &HD, 100, ByVal titre2)
titre2 = Left$(titre2, InStr(titre2, Chr$(0)) - 1)
End Function
Sub fenetres(fen, num_niv)
'liste toutes les sous-fenetres de fen et des fenetres de même niveau
Do While fen <> 0
txt = titre(fen)
txt2 = titre2(fen)
If txt2 <> txt Then txt = txt & " - " & txt2
txt = Trim(txt & " (" & classe(fen) & ")")
Cells(1 + ActiveSheet.Cells.Find("*", , , , , xlPrevious).Row, num_niv) = txt
'relancer la macro un niveau de plus
Run "fenetres", GetWindow(fen, 5), num_niv + 1
fen = GetWindow(fen, 2)
Loop
End Sub
Sub ttes_fen() 'recherche à partir de 0,0
Cells.ClearContents
Cells(1) = " "
niv = cherche_fenetre(0, 0)
fenetres niv, 1
Cells.WrapText = False
Cells(1).Select
End Sub
La macro ttes_fen utilise une procédure récursive (la macro fenetres est appelée par elle-même) pour balayer toutes les fenêtres depuis le niveau supérieur jusqu'au dernier niveau,
et afficher leur nom et leur classe dans une page Excel.
Sur le même principe, on peut faire la liste des fenêtres Internet Explorer ouvertes (cliquez ici).
Quelques exemples de fenêtres avec le nom de leur classe :
La barre de classe Shell_TrayWnd est la barre des tâches.
Elle a comme fenêtres filles,
- une fenêtre de la classe Button qui est le bouton Démarrer.
- Et aussi une barre de la classe TrayNotifyWnd qui est la barre contenant les icônes des applications démarrées avec Windows (cette barre peut par exemple contenir une pendule de classe TrayClockWClass).
- Et puis une barre ReBarWindow32 qui contient la barre des tâches (classe MSTaskSwWClass) et la barre d'outils Windows (classe ToolbarWindow32).
Les fenêtres de la classe IEFrame sont celles d'Internet Explorer, celles de classe NotePad sont celles du bloc notes. La classe ExploreWClass correspond à l'explorateur Windows, wndclass_desked_gsk à VBA.
La fenêtre de classe XLMAIN est la fenêtre principale Excel.
Elle contient
- des fenêtres de classe EXCEL2 (barres en haut ou en bas), qui supportent les barres de menus et d'outils de classe MsoCommandBar (Barre de menus Feuille de calcul, Dessin, Visual Basic, Standard, Mise en forme...), lesquelles peuvent comporter des fenêtres de classe Edit (listes déroulantes).
- une fenêtre EXCEL; qui supporte la zone de noms (classe ComboBox),
- et une fenêtre de classe XLDESK correspondant à la zone de travail des pages Excel (et contenant une fenêtre de classe EXCEL7 avec ses barres de défilement ScrollBar).
Sur le même principe que le premier exemple, on peut rechercher toutes les barres d'outils (fenêtre
dont la classe est égale à "MsoCommandBar") et les masquer en les recouvrant
de rectangles de la même couleur que le fond Windows (téléchargez le fichier Excel zippé) :
Declare Function cherche_fenetre Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function get_titre Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function GetSysColorBrush Lib "user32" (ByVal nIndex As Long) As Long
Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Declare Function IsWindowVisible Lib "user32" ( _
ByVal hWnd As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim titre As String
Dim classe As String
Sub masque_BO_XL()
Application.OnTime Now + 0.5 / 3600 / 24, "xqt"
End Sub
Sub xqt()
lin = 0
poign = cherche_fenetre(0, 0)
Do While poign <> 0
lin = lin + 1
classe = String(100, Chr$(0))
GetClassName poign, classe, 100
classe = Left$(classe, InStr(classe, Chr$(0)) - 1)
If classe = "MsoCommandBar" Then masque (poign)
'sous process*******************************************
sspoign = GetWindow(poign, 5)
Do While sspoign <> 0
lin = lin + 1
classe = String(100, Chr$(0))
GetClassName sspoign, classe, 100
classe = Left$(classe, InStr(classe, Chr$(0)) - 1)
If classe = "MsoCommandBar" Then masque (sspoign)
'ss ss process*******************************************
ssspoign = GetWindow(sspoign, 5)
Do While ssspoign <> 0
lin = lin + 1
classe = String(100, Chr$(0))
GetClassName ssspoign, classe, 100
classe = Left$(classe, InStr(classe, Chr$(0)) - 1)
If classe = "MsoCommandBar" Then masque (ssspoign)
ssspoign = GetWindow(ssspoign, 2)
Loop
'*******************************************
sspoign = GetWindow(sspoign, 2)
Loop
'*******************************************
poign = GetWindow(poign, 2)
Loop
End Sub
Sub masque(hWnd)
Dim coord As RECT
coul = GetSysColorBrush(0)
Call GetWindowRect(hWnd, coord)
If IsWindowVisible(hWnd) Then Call FillRect(GetWindowDC(0), coord, coul)
End Sub
- Les API
- Les correspondances entre macros VBA, macros Excel 4, fonctions de feuilles de calcul et API.