[VBA] Lister les tâches (pas les process) en cours

F22Raptor

XLDnaute Impliqué
Hello,
Je veux utiliser la fonction AppActivate dans une macro, pour activer une fenêtre en cours d'exécution (faire l'équivalent d'un ALT-TAB sur cette tâche).
Le nom de la tâche à coller derrière AppActivate est donc celui que l'on lit quand on fait ALT-TAB.

Mon souci, c'est que l'appli que je veux activer s'appelle "MonAppli Bidule 3.2 Prod", et que le numéro de version pourra changer.
Idéalement, il me faudrait une boucle façon :
VB:
For Each Tache In TacheActives
     If Left(Tache.Name, 15) = "MonAppli Bidule" Then AppActivate Tache.Name
Next Tache

Savez-vous si quelque chose du genre serait possible sous VBA ?
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Lister les tâches (pas les process) en cours

Bonjour.
Si cette application est lancée par une autre partie du code, il faut savoir que Shell est une fonction qui renvoie un identificateur de la fenêtre, à conserver en principe. Celui ci peut être précisé par la suite à la place du titre de la fenêtre à un AppActivate.
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Lister les tâches (pas les process) en cours

Il y a des API, mais je ne les ai jamais utilisées…
VB:
Private Declare Function GetTopWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetNextWindow Lib "user32.dll" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Private Declare Function GetWindowModuleFileName Lib "user32.dll" Alias "GetWindowModuleFileNameA" (ByVal hwnd As Long, ByVal pszFileName As String, ByVal cchFileNameMax As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
 

PMO2

XLDnaute Accro
Re : [VBA] Lister les tâches (pas les process) en cours

Bonjour à tous,

Je veux utiliser la fonction AppActivate dans une macro, pour activer une fenêtre en cours d'exécution
Par le biais des APIs, on peut récupérer le PID concerné et activer une fenêtre en cours d'exécution avec AppActivate.
Cependant il y a une restriction : si la fenêtre est minimisée, elle ne sera pas activée.

Il vaut mieux donc utiliser (entre autres) les APIs ShowWindow et SetForegroundWindow.

1) Copiez le code suivant dans un module standard
Code:
Declare Function EnumWindows Lib "user32" ( _
  ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
  ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" ( _
  ByVal hwnd As Long) As Long
Declare Function ShowWindow Lib "user32" ( _
  ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Declare Function SetForegroundWindow Lib "user32" ( _
  ByVal hwnd As Long) As Long
  
'/// Si on tient absolument à utiliser AppActivate, il faut chercher le PID.
'/// Restriction : si la fenêtre est minimisée, elle ne sera pas activée.
Declare Function GetWindowThreadProcessId Lib "user32" ( _
  ByVal hwnd As Long, lpdwProcessId As Long) As Long
'///

Const SW_SHOWNORMAL = 1

Dim SearchString$
Dim myHwnd&
Dim A$
Dim B$  '°°° Pour visualiser (à virer par la suite)

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim LenChaine&
Dim bool As Boolean
'--- Enumération du nom de chaque fenêtre ---
bool = True
LenChaine& = GetWindowTextLength(hwnd)
A$ = Space(LenChaine&)
GetWindowText hwnd, A$, LenChaine& + 1
'--- Si le nom contient la chaîne recherchée ---
If InStr(1, A$, SearchString) > 0 Then
  B$ = A$ '°°° Pour visualiser (à virer par la suite)
  myHwnd& = hwnd  'on récupère son Handle
  bool = False
End If
'--- Tant que bool=True on continue l'énumération ---
EnumWindowsProc = bool
End Function

Sub ActiveFenetre()
Dim ProcessID&
'---
'--- Chaîne à rechercher dans le titre de la fenêtre ---
SearchString$ = "Paint"   'à adapter (ex : "MonAppli Bidule")
'---
EnumWindows AddressOf EnumWindowsProc, ByVal 0&

'°°° Pour visualiser (à virer par la suite) °°°
If B$ <> "" Then
  MsgBox "On a trouvé ''" & B$ & "''"
  B$ = ""
Else
  MsgBox "Aucune fenêtre contenant ''" & SearchString$ & "'' n'a été trouvée."
End If
'°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

'--- Active la fenêtre (c'est la bonne approche)---
ShowWindow myHwnd&, SW_SHOWNORMAL 'agrandit la fenêtre si elle est minimisée
SetForegroundWindow myHwnd&       'place la fenêtre au 1er plan

''/// Si on tient absolument à utiliser AppActivate, il faut chercher le PID.
''/// Restriction : si la fenêtre est minimisée, elle ne sera pas activée.
''--- Recherche du PID ---
'GetWindowThreadProcessId myHwnd&, ProcessID
'If ProcessID& > 0 Then AppActivate ProcessID&
''///

End Sub

2) Ouvrez MS Paint (ou changez la variable de recherche SearchString$ = "Paint" )
3) Lancez la Sub ActiveFenetre
 

Pièces jointes

  • Enumérer les fenêtres pour identifier leur Hwnd et leur PID.xlsm
    24.1 KB · Affichages: 69

Statistiques des forums

Discussions
312 201
Messages
2 086 166
Membres
103 151
dernier inscrit
nassim