Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TUER UNE/DES SESSION(S) CACHÉE(S) D'EXCEL À PARTIR D'UNE AUTRE SESSION


Information sur la source

Catégorie :VBA Classé sous : arreter processus, api, pid, vba, vb6 Niveau : Initié Date de création : 06/08/2008 Date de mise à jour : 04/09/2008 18:52:53 Vu / téléchargé: 2 859 / 194

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Cette source(fichier excel) permet d'arreter une ou plusieurs session excel caché et ce a partir d'une autre session excel. Juste pour le fun car évidemment en l'état cela ne sert pas à grand chose.
Vous trouverez dans ce fichier 3 boutons:
- le premier permet de lancer une session excel caché (utile uniquement pour la demo)
- le deuxieme permet de voire toute les sessions excel en cours
- le troisieme permet d'arreter les sessions cachées d'excel

Noter que cette source est facilement transposable en VB6 car elle utilise en grande partie les API Windows
 

Source

  • 'Macro Créée par : BigFish_le Vrai (Philippe E)
  • 'le :06-08-2008
  • 'V1.0
  • '
  • Option Explicit
  • 'API ouverture processus et ses constantes
  • Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  • Public Const PROCESS_VM_READ As Long = (&H10)
  • Public Const PROCESS_QUERY_INFORMATION As Long = (&H400)
  • Public Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long
  • Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
  • Declare Function GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
  • Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
  • Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId 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 GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  • Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  • Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  • Const PROCESS_TERMINATE As Long = &H1
  • Public Const MAX_PATH As Integer = 260
  • Public hProcess As Long 'handle du processus
  • Public bob As Long, CurrentProcessId As Long, ViewOnly As Boolean
  • Function EnumWinProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
  • '-----------------------------------
  • 'enumeration des processus
  • 'renvoie du/des session(s) excel
  • 'Arret du/des Processus excel caché
  • '-----------------------------------
  • Dim RetVal As Long, ProcessID As Long, ThreadID As Long
  • Dim WinClassBuf As String * 255, WinTitleBuf As String * 255
  • Dim WinClass As String, WinTitle As String, NomExe As String
  • ' see the Windows Class and Title for each top level Window
  • RetVal = GetClassName(lhWnd, WinClassBuf, 255)
  • WinClass = StripNulls$(WinClassBuf) ' remove extra Nulls & spaces
  • RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
  • WinTitle = StripNulls$(WinTitleBuf)
  • ' la fenetre(thread principale)est elle visible ?
  • RetVal = IsWindowVisible(lhWnd)
  • ' on recupere l'PID de la fenetre(thread principale)
  • ThreadID = GetWindowThreadProcessId(lhWnd, ProcessID)
  • ' on recupere le nom du thread principale
  • NomExe = GetProcessFileName(ProcessID)
  • With Worksheets("sheet1")
  • If NomExe = "excel.exe" And WinTitle Like "Microsoft Excel*" = True Then
  • ' ecriture des données sur la feuille
  • .Range("A" & bob).Value = NomExe
  • .Range("B" & bob).Value = ProcessID
  • ' on converti le resultat binaire en booleen pour une meilleur lecture
  • .Range("C" & bob).Value = CBool(RetVal * -1)
  • .Range("D" & bob).Value = WinTitle
  • ' si le processus est le processus courant
  • ' on lui applique une mise en forme specifique
  • If ProcessID = CurrentProcessId Then
  • .Range("A" & bob & ":E" & bob).Interior.ColorIndex = 35
  • .Range("E" & bob).Value = "Current"
  • End If
  • ' si le thread principale d'excel est invisible
  • If RetVal = 0 Then
  • .Range("A" & bob & ":E" & bob).Interior.ColorIndex = 44
  • If ViewOnly = False Then
  • ' on arrete le processus
  • ' La fonction renvoie 1 si le processus c'est arrete
  • If CloseProcess(ProcessID) = 1 Then
  • .Range("E" & bob).Value = "Killed"
  • Else
  • MsgBox "le process n'a pas pu etre arreté ! ", vbExclamation
  • End If
  • End If
  • End If
  • bob = bob + 1
  • End If
  • End With
  • CloseHandle hProcess
  • EnumWinProc = True
  • End Function
  • Public Function StripNulls(OriginalStr As String) As String
  • ' This removes the extra Nulls so String comparisons will work
  • If (InStr(OriginalStr, Chr(0)) > 0) Then
  • OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
  • End If
  • StripNulls = OriginalStr
  • End Function
  • ' ---------------------------------------------
  • ' Renvoie le Nom du processus
  • ' ---------------------------------------------
  • ' Parametre
  • ' ProcessID : ID du processus
  • ' ---------------------------------------------
  • ' d'apres un code de : MadMatt
  • ' Titre d'origine : Renvoie le chemin complet du processus
  • ' Son Site Perso : http://matthieu.napoli.free.fr
  • ' Le site du code : http://vbsystemlibrary.free.fr/code.php?ID=5
  • ' ---------------------------------------------
  • Public Function GetProcessFileName(ByVal ProcessID As Long) As String
  • ' Processus 0
  • If ProcessID = 0 Then
  • GetProcessFileName = "[System Process]"
  • ' Processus 4
  • ElseIf ProcessID = 4 Then
  • GetProcessFileName = "System"
  • Else
  • ' On cherche son chemin d'accès complet
  • 'Dim hProcess As Long 'handle du processus
  • Dim hModule As Long 'handle du module de l'exe
  • Dim Ret As Long 'résultat
  • ' On demande un handle pour le processus
  • hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ Or PROCESS_TERMINATE, 0&, ProcessID)
  • ' Si erreur (accès refusé)
  • If hProcess Then
  • ' On préformate la chaine
  • GetProcessFileName = Space(MAX_PATH)
  • ' On récupère son nom complet
  • GetModuleFileNameEx hProcess, 0, GetProcessFileName, MAX_PATH
  • ' On ferme le handle ouvert
  • 'CloseHandle hProcess
  • ' On retire le vbNUllChar de fin de chaine
  • GetProcessFileName = Left(GetProcessFileName, InStr(GetProcessFileName, vbNullChar) - 1)
  • 'on extrait le nom de l'Image du processus
  • GetProcessFileName = LCase(Right(GetProcessFileName, InStr(1, StrReverse(GetProcessFileName), "\") - 1))
  • Exit Function
  • ElseIf hProcess = 0 Then
  • GetProcessFileName = vbNullString
  • End If
  • End If
  • End Function
  • ' ---------------------------------------------
  • ' Termine le processus
  • ' ---------------------------------------------
  • Public Function CloseProcess(ProcessID As Long) As Long
  • 'fermeture du thread principal d'excel
  • CloseProcess = TerminateProcess(hProcess, 0)
  • End Function
'Macro Créée par : BigFish_le Vrai (Philippe E)
'le :06-08-2008
'V1.0
'
Option Explicit

    'API ouverture processus et ses constantes
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Const PROCESS_VM_READ As Long = (&H10)
    Public Const PROCESS_QUERY_INFORMATION As Long = (&H400)
    
    Public Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long
    Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
    Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId 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 GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    
    Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Const PROCESS_TERMINATE As Long = &H1
    
    Public Const MAX_PATH As Integer = 260
    
    Public hProcess As Long    'handle du processus
    Public bob As Long, CurrentProcessId As Long, ViewOnly As Boolean

Function EnumWinProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
    '-----------------------------------
    'enumeration des processus
    'renvoie du/des session(s) excel
    'Arret du/des Processus excel caché
    '-----------------------------------
    Dim RetVal As Long, ProcessID As Long, ThreadID As Long
    Dim WinClassBuf As String * 255, WinTitleBuf As String * 255
    Dim WinClass As String, WinTitle As String, NomExe As String
    
    ' see the Windows Class and Title for each top level Window
    RetVal = GetClassName(lhWnd, WinClassBuf, 255)
    WinClass = StripNulls$(WinClassBuf)  ' remove extra Nulls & spaces
    RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
    WinTitle = StripNulls$(WinTitleBuf)
    ' la fenetre(thread principale)est elle visible ?
    RetVal = IsWindowVisible(lhWnd)
    ' on recupere l'PID de la fenetre(thread principale)
    ThreadID = GetWindowThreadProcessId(lhWnd, ProcessID)
    ' on recupere le nom du thread principale
    NomExe = GetProcessFileName(ProcessID)
    With Worksheets("sheet1")
        If NomExe = "excel.exe" And WinTitle Like "Microsoft Excel*" = True Then
            ' ecriture des données sur la feuille
            .Range("A" & bob).Value = NomExe
            .Range("B" & bob).Value = ProcessID
            ' on converti le resultat binaire en booleen pour une meilleur lecture
            .Range("C" & bob).Value = CBool(RetVal * -1)
            .Range("D" & bob).Value = WinTitle
            ' si le processus est le processus courant
            ' on lui applique une mise en forme specifique
            If ProcessID = CurrentProcessId Then
                .Range("A" & bob & ":E" & bob).Interior.ColorIndex = 35
                .Range("E" & bob).Value = "Current"
            End If
            ' si le thread principale d'excel est invisible
            If RetVal = 0 Then
                .Range("A" & bob & ":E" & bob).Interior.ColorIndex = 44
                If ViewOnly = False Then
                    ' on arrete le processus
                    ' La fonction renvoie 1 si le processus c'est arrete
                    If CloseProcess(ProcessID) = 1 Then
                        .Range("E" & bob).Value = "Killed"
                    Else
                        MsgBox "le process n'a pas pu etre arreté ! ", vbExclamation
                    End If
                End If
            End If
            bob = bob + 1
        End If
    End With
    CloseHandle hProcess
    EnumWinProc = True
End Function

Public Function StripNulls(OriginalStr As String) As String
   ' This removes the extra Nulls so String comparisons will work
   If (InStr(OriginalStr, Chr(0)) > 0) Then
      OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
   End If
   StripNulls = OriginalStr
End Function
      
' ---------------------------------------------
' Renvoie le Nom du processus
' ---------------------------------------------
' Parametre
' ProcessID : ID du processus
' ---------------------------------------------
' d'apres un code de    : MadMatt
' Titre d'origine       : Renvoie le chemin complet du processus
' Son Site Perso        : http://matthieu.napoli.free.fr
' Le site du code       : http://vbsystemlibrary.free.fr/code.php?ID=5
' ---------------------------------------------
Public Function GetProcessFileName(ByVal ProcessID As Long) As String
    ' Processus 0
    If ProcessID = 0 Then
        GetProcessFileName = "[System Process]"
    ' Processus 4
    ElseIf ProcessID = 4 Then
        GetProcessFileName = "System"
    Else
        ' On cherche son chemin d'accès complet
        'Dim hProcess As Long    'handle du processus
        Dim hModule As Long    'handle du module de l'exe
        Dim Ret As Long        'résultat
        ' On demande un handle pour le processus
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ Or PROCESS_TERMINATE, 0&, ProcessID)
        ' Si erreur (accès refusé)
        If hProcess Then
            ' On préformate la chaine
            GetProcessFileName = Space(MAX_PATH)
            ' On récupère son nom complet
            GetModuleFileNameEx hProcess, 0, GetProcessFileName, MAX_PATH
            ' On ferme le handle ouvert
            'CloseHandle hProcess
            ' On retire le vbNUllChar de fin de chaine
            GetProcessFileName = Left(GetProcessFileName, InStr(GetProcessFileName, vbNullChar) - 1)
            'on extrait le nom de l'Image du processus
            GetProcessFileName = LCase(Right(GetProcessFileName, InStr(1, StrReverse(GetProcessFileName), "\") - 1))
            Exit Function
        ElseIf hProcess = 0 Then
            GetProcessFileName = vbNullString
        End If
    End If
End Function
' ---------------------------------------------
' Termine le processus
' ---------------------------------------------
Public Function CloseProcess(ProcessID As Long) As Long
    'fermeture du thread principal d'excel
    CloseProcess = TerminateProcess(hProcess, 0)
End Function

Conclusion

Je suis loin d'etre un expert de la programmation a l'aide des API donc ce n'est surement pas parfait.
Toute suggestion est la bien venu.

Merci à MadMatt pour la partie : Renvoie le nom du processus

A+

3ddI7IHd
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • Kill hidden excel v1.1.xlsTélécharger ce fichier [Réservé aux membres club]92 672 octets

Télécharger le zip

Historique

04 septembre 2008 18:52:53 :
toute petite correction du code

Commentaires et avis

signaler à un administrateur
Commentaire de us_30 le 06/08/2008 12:31:06 10/10

Interréssant, et à priori applicable pas que sous les applications d'Office... 10/10 !

Amicalement,
Us.

signaler à un administrateur
Commentaire de bigfish_le vrai le 06/08/2008 16:55:23

Salut us_30,

merci pour tes encouragements ^^

Amicalement,

3ddI7IHd

signaler à un administrateur
Commentaire de Witold le 07/08/2008 22:31:16

Merci d'avoir résolu mon problème

signaler à un administrateur
Commentaire de bigfish_le vrai le 04/09/2008 18:57:02

Bonjour á tous,

apparemment certain d'entre vous rencontre un probleme lors de l'ouverture du fichier. Ce probleme provoquerait la fermeture d'excel.

Si vous rencontrez ce probleme merci de m'en fair part ici ou par MP

Amicalement,

3ddI7IHd

signaler à un administrateur
Commentaire de Chrysostome le 13/10/2008 11:22:56

Salut! Juste pour dire que ça sert quand il faut fermer des programmes à des fins de sauvegarde ou de transfert FTP ou ... L'emploi de killers est dangereux et difficilement maîtrisable.

signaler à un administrateur
Commentaire de aljan le 22/11/2008 18:49:24

Bonjour,
Un de plus pour confirmer que ça sert! j'ai adapté ce code à une application qui me posait quelques problèmes de nettoyage en cas de fermeture anormale et cela fonctionne très bien.
Merci !
aljan

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Exécuter un module VBA d'excel à partir de VB6 URGENT [ par Karine ] Je n'arrive pas à trouver une instruction qui me permette de déclencher un module VBA dans un fichier excel depuis VB6.Je voudrais savoir de une si c' Installation VB ou VBA [ par stailer ] Bonsoir,J'ai fait déjà plusieurs packs d'installation avec l'assistant Empaquetage de VB6 mais aussi avec ce même Assistant pour Office Developper, af Affecter un TABLEAU à un COMBOBOX [ par pianedd777 ] Depuis peu, je convertis un projet VBA en un projet VB6. Evidemment, je rencontre quelques problèmes.D'un premier temps, j'ai pu obtenir un petit prog ugent svp, quelle est la commande pour faire afficher des pages powerpoint depuis VB6 [ par hugotechno ] Salut, je redemande de l'aide, car personne ne m'a répondu!J'ai fai un p tit prog sur VBA Powerpoint pour pouvoir afficher des pages à l'aide d'un pet Constantes pour les API [ par cma002 ] Bonjour,Juste une simple question ; Quand j'utilise SW_HIDE pour les API, VB6 me dit que la constante n'est pas déclarée.Ces constantes ne sont-elle p vba et telnet [ par aqwzsx123456 ] bonjour je dois d abord vous indiquer que je suis novice en vb et encore plus sur les apije doit realiser, pour mon stage en entreprise, une applicati Numéro serie & Registre & VBA ou VB6 [ par QUINQUIN67 ] Bonjour, je suis débutant.J'arrive enfin à récuperer en vb6 un numero de serie inscrit dans la base de registre par contre comment faire pour enlever VB6 vers VBA [ par dany108 ] Bonjour à tous.J'utilise ce code sous VB6 pour lister les imprimantes disponibles :For Each X In Printers ListeImprimante.AddItem X.DeviceNameNextje petite application avec base de données !!! [ par phoenix91720 ] Bonjour à tous....J'ai développé une petite application en VBA Excel pour gérer mes DVD, DIVX, Cassettes et autres...Le problème, c'est que vba n'a pa une API pour VBA ??? [ par DocteurVB ] slt tt le monde,je voudrais savoir s'il existe une solution pour masquer ou griser les boutons "réduire" et "restaurer" de excel (pas ceux du classeur


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version


HTC Magic

Entre 429€ et 429€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,640 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.