gérer une application externe

nono59

XLDnaute Nouveau
Salut à tous,

Y-a-t-il un code VBA qui permet de savoir si telle ou telle application est ouverte ? ceci afin de permettre une boucle d'attente avant la fermeture de l'application concernée et de pouvoir continuer l'execution du code...?

Merci d'avance.
 

Jam

XLDnaute Accro
Salut nono59,

Essai le code suivant:
Code:
Function ApplicationIsRunning(ApplicationClassName As String) As Boolean
' returns True if the application is running
' example: If Not ApplicationIsRunning('Outlook.Application') Then Exit Sub
Dim AnyApp As Object
  On Error Resume Next
  Set AnyApp = GetObject(, ApplicationClassName)
  ApplicationIsRunning = Not AnyApp Is Nothing
  Set AnyApp = Nothing
  On Error GoTo 0
End Function

La fonction renvoie Vrai ou Faux si elle trouve le programme.

Bon courage
 

nono59

XLDnaute Nouveau
Bonjour et Merci de ton aide,

Le code Function que tu m'a envoyé semble fonctionné mais uniquement pour les programmes Office (Outlook, Word, Excel) mais pas pour les autres programmes, à moins qu'il faille les nommer autrement que par le nom excutable ?

Aurais-tu la solution ?
 

Jam

XLDnaute Accro
Re,

Essai le code suivant. Attention le nom de la fenêtre doit correspondre exactement !

Code:
Public Declare Function FindWindow Lib 'user32' Alias 'FindWindowA' _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Function IsAppRunning(sProg As String) as boolean
    Dim HWnd As Long
    IsAppRunning = False
    HWnd = FindWindow(vbNullString, sProg)
    If HWnd > 0 Then
        IsAppRunning = True
    End If
End Sub

Bon courage
 

Jam

XLDnaute Accro
Re Salut nono59,

Bon, cela n'a pas été simple mais j'ai enfin la solution :)
En fait le programme que je te propose ci-après va te permettre de connaître le bon paramètre à utiliser dans la fonction donnée précédement. En effet, dans la fonction précédente il fallait donner la syntaxe exacte et complète de la fenêtre, ce qui n'est pas facile. Ici, il suffira de transmettre la class qui t'intéresse.
Aller, c'est parti ! Ajoute en entête de module les déclarations d'API suivante:
Code:
Declare Function FindWindow Lib 'user32' Alias 'FindWindowA' _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 GetClassName Lib 'user32' Alias 'GetClassNameA' _
    (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Ensuite il va falloir procéder en 2 étapes. On va d'abord lister l'ensemble des fenêtres ouvertes dans ta cession (la liste se trouve dans la fenêtre de débogage). Le premier paramètre correspond au handle de la fenêtre sous forme d'un chiffre, le second est le titre de la fenêtre, le troisième le nom de class (ce qui nous intéresse).
Avant de lancer cette énumération (la procédure Test)lance le programme que tu veux trouver.
Ensuite recherche dans la (longue) liste le nom de ton programme. Ensuite tu n'as plus qu'à appeler la fonction IsAppRunning en lui passant le nom de la class qui t'intéresse et le tour est joué B)
Le code donc:
Code:
'Lance la procédure d'énumération
Sub Test()
    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub

'Enumère les fenêtres dans la session
Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim sSave As String, Ret As Long
    Ret = GetWindowTextLength(hwnd)
    sSave = Space(Ret)
    GetWindowText hwnd, sSave, Ret + 1
    Debug.Print Str$(hwnd) + ' / ' + sSave + ' / ' + sClass(hwnd)
    'continue enumeration
    EnumWindowsProc = True
End Function

'Donne le nom de la class du handle de la fenêtre
Function sClass(x As Long)
    Dim className As String
    Dim retValue As Long
        
    className = String$(256, ' ')
    retValue = GetClassName(x, className, 255)
    sClass = Left$(className, InStr(className, vbNullChar) - 1)
End Function

'Test si un programme est lancé ou non
Function IsAppRunning(x As String) As Boolean
    Dim hwnd As Long
    IsAppRunning = False
    hwnd = FindWindow(x, vbNullString)
    If hwnd > 0 Then
        IsAppRunning = True
    End If
End Function

Si tu as des questions, n'hésite pas ;)
Bon courage
 

Luki

XLDnaute Accro
Bonjour Nono, Mrexcel

J'ai eu un cas dans le genre, je l'ai abordé de manière plus simple, mais certainement beaucoup moins complète:

Sub IsOpenApp()
On Error Resume Next
AppActivate ('Titre le l'application ou de la fenêtre de l'appli')
if err.Number=0 then .....
End Sub


L'aide correspondante:
Remarques

L'instruction AppActivate rend active l'application ou la fenêtre nommée, mais ne l'agrandit ni ne la réduit. La fenêtre d'application cesse d'être active dès que l'utilisateur exécute une action qui entraîne la fermeture de la fenêtre ou l'activation d'une autre. Utilisez la fonction Shell pour démarrer une application et définir le style de la fenêtre.
Pour rechercher l'application à activer, les chaînes de titre de toutes les applications sont comparées avec celle de l'argument title. Si aucun titre ne correspond exactement à l'argument, une application dont le titre commence par la valeur de l'argument title est activée. Si plusieurs applications ont pour nom l'argument title, l'une d'entre elles est activée arbitrairement.

A bientôt
 

nono59

XLDnaute Nouveau
Re MrExcel,

Un seul mot me vient 'IMPRESSIONNANT'

Je suis parvenu à trouver la class correspondant au programme choisi et j'ai utiliser la fonction dans une cellule en donnant ce nom et ça marche.
Pour corser le tout, je voudrais utiliser cette fonction dans un code VBA en bouclant tant que la valeur n'est pas égale à 'FAUX', comment faire ?

PS1 : j'ai enfin appris à quoi servait le debug.print, je me demandais toujours où parter les infos, je savais pas qu'il fallait ouvrir la fenêtre 'Execution', j'ai donc bien appris aujourd'hui...


PS2 : j'ai remarque que le résultat de la fonction ne se mettait pas à jour dans la cellule quand je fermais l'application concernée et même en faisant F9 ?!!? il faut faire un F2 et revalider la formule pour la MAJ, bizarre, non ?

En tout cas, merci
 

Discussions similaires

Statistiques des forums

Discussions
312 225
Messages
2 086 411
Membres
103 201
dernier inscrit
centrale vet