Accueil > > > TUER UNE/DES SESSION(S) CACHÉE(S) D'EXCEL À PARTIR D'UNE AUTRE SESSION
TUER UNE/DES SESSION(S) CACHÉE(S) D'EXCEL À PARTIR D'UNE AUTRE SESSION
Information sur la source
Description
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
Historique
- 04 septembre 2008 18:52:53 :
- toute petite correction du code
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|