Vérifier si BlocNote ouvert ou fermé

xhudi69

XLDnaute Accro
Bonjour à toutes et à tous,

J'ai un BlocNote situé sur un serveur et j'aimerais savoir si il est ouvert ou fermé (peu importe qui l'utilise, là n'est pas la question).

Mes recherches sur le net n'ont rien donné si ce n'est des codes qui ne fonctionnent pas chez moi.

Merci à vous pour un bout de code ou une piste.......

@+ :cool:
 

PMO2

XLDnaute Accro
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour,

Peut être avec ce code
Code:
Sub aa()
Dim objWMIService As Object
Dim colItems As Object
Dim objItem As Object
'---
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'", , 48)
For Each objItem In colItems
  If InStr(1, objItem.CommandLine, "notepad.exe", vbTextCompare) > 0 Then
    MsgBox "Le Bloc-notes est ouvert."
  End If
Next
End Sub
 

xhudi69

XLDnaute Accro
Re : Vérifier si BlocNote ouvert ou fermé

Bonsoir PM02, le Forum,

Merci pour ta réponse, le code me dit si le BlocNote est ouvert (instance) mais comment savoir si celui-là ("C:\Users\ARL MULTI\Desktop\Bonjour.txt")est ouvert ?

Merci pour ta réponse.

@+ :cool:
 

camarchepas

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour,

Voici une solution avec la recherche sur fenetre via les api Windows que j'utilise souvent

Il faut ajuster dans Test le nom de la fenetre en fonction de ce que tu veux .

Code:
Option Explicit
' ***************************************************************************************************************
'                             Déclaration des Fonctions de l'API Windows
' ***************************************************************************************************************
'
#If Win64 Then
   
   Declare PtrSafe Function Cherche_Fenêtre Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
   Declare PtrSafe Function EstVisible Lib "user32" Alias "IsWindowVisible" (ByVal Hwnd As Long) As Boolean
   Declare PtrSafe Function EstFenêtre Lib "user32" Alias "IsWindow" (ByVal Hwnd As Long) As Boolean
   Declare PtrSafe Function Get_Titre Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
   Declare PtrSafe Function GetWindow Lib "user32" (ByVal Hwnd As Long, ByVal wCmd As Long) As Long

#Else
   
   Declare Function Cherche_Fenêtre Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
   Declare Function EstVisible Lib "user32" Alias "IsWindowVisible" (ByVal Hwnd As Long) As Boolean
   Declare Function EstFenêtre Lib "user32" Alias "IsWindow" (ByVal Hwnd As Long) As Boolean
   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

#End If
'Déclaration des variables liées aux fonctions
Private Const GW_HWNDNEXT As Long = 2

Sub test()
Dim Retour As Long
Dim Fenetre As String
Fenetre = "essai.bat" & Chr(160) & "- Bloc-notes"
Retour = RechercheFenêtre_Par_MotsClés(Fenetre, True)
If Retour = 0 Then
  MsgBox Fenetre & " n'est pas ouvert"
 Else
  MsgBox Fenetre & " est ouvert"
End If
End Sub

Function RechercheFenêtre_Par_MotsClés(MotsDuTitres As String, Optional Bloque As Boolean) As Long
' Fonction qui renvoie le Handle d'une fenêtre Mère dont on ne donne qu'une partie du Titre

Dim Fenêtre As Long, NbOccurrences As Long, IdFenêtre As Long
Dim TitreFenêtre As String, AppelMacro As String
Dim Temp1 As String, temps2 As String

Fenêtre = Cherche_Fenêtre(0, 0)   ' Recherche en Z, à partir de 0,0
IdFenêtre = 0
NbOccurrences = 0

Do While Fenêtre <> 0
    If EstVisible(Fenêtre) And EstFenêtre(Fenêtre) Then
        TitreFenêtre = RécupèreTitre(Fenêtre)
'       For t = 1 To Len(MotsDuTitres)
'        temps1 = Asc(Mid(TitreFenêtre, t, 1))
'         temps2 = Asc(Mid(MotsDuTitres, t, 1))
'       Next
        If InStr(1, TitreFenêtre, MotsDuTitres) > 0 Then
            IdFenêtre = Fenêtre ' récupération du Handle de la fenêtre
            NbOccurrences = NbOccurrences + 1
        End If
    End If
        
    ' On passe à la Fenêtre suivante du même niveau (selon un parcours en Z)
    Fenêtre = GetWindow(Fenêtre, GW_HWNDNEXT)
Loop

Select Case NbOccurrences
Case Is = 0
    If Not Bloque Then
       MsgBox ("Aucune fenêtre n'a été trouvée avec ces mots.")
       Stop
    End If
Case Is = 1
    RechercheFenêtre_Par_MotsClés = IdFenêtre
Case Is > 1
    If Not Bloque Then
     MsgBox ("Plusieurs fenêtres ont été trouvées avec ces mots !")
     Stop
    End If
    RechercheFenêtre_Par_MotsClés = IdFenêtre
End Select
End Function

Function RécupèreTitre(Handle As Long) As String
' Retourne le Titre de l'Objet (Fenêtre ou Champ)
Dim Titre As String
    Titre = String(150, Chr$(0))
    Get_Titre Handle, Titre, 150
    RécupèreTitre = Left$(Titre, InStr(Titre, Chr$(0)) - 1)
End Function
 

job75

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour xhudi69, PMO2, camarchepas, le forum,

Ceci fonctionne bien chez moi (Win 7 - Excel 2010) avec un fichier du Bloc-notes .txt ou .bat :

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

Sub TestFichierBlocNotes()
Dim nom$, h&
nom = "Fichier"
h = FindWindow("Notepad", nom & Chr(160) & "- Bloc-notes")
MsgBox "'" & nom & "' est " & IIf(h, "ouvert", "fermé"), , "Bloc-notes"
End Sub
Edit : je ne pense pas qu'on puisse connaître le chemin d'accès du fichier ouvert dans la fenêtre.

En effet on peu ouvrir plusieurs fenêtres du même nom à partir de fichiers ayant des chemin d'accès différents, et même à partir du même fichier.

A+
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Bonsoir PM02, le Forum,

Merci pour ta réponse, le code me dit si le BlocNote est ouvert (instance) mais comment savoir si celui-là ("C:\Users\ARL MULTI\Desktop\Bonjour.txt")est ouvert ?

Merci pour ta réponse.

@+ :cool:
Il te suffit d'adapter le code en remplaçant
Code:
If InStr(1, objItem.CommandLine, "notepad.exe", vbTextCompare) > 0
par
Code:
If InStr(1, objItem.CommandLine, "C:\Users\ARL MULTI\Desktop\Bonjour.txt", vbTextCompare) > 0
D'autre part si l'on veut simplement savoir si le bloc-notes est ouvert :
Code:
Sub aa()Dim objWMIService As Object
Dim colItems As Object
Dim objItem As Object
'---
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'", , 48)
For Each objItem In colItems
   MsgBox "Le Bloc-notes est ouvert.":Exit For
Next
End Sub
suffit.
A+
 

PMO2

XLDnaute Accro
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour,

Bonsoir PM02, le Forum,

Merci pour ta réponse, le code me dit si le BlocNote est ouvert (instance) mais comment savoir si celui-là ("C:\Users\ARL MULTI\Desktop\Bonjour.txt")est ouvert ?

Essayez
Code:
Sub bb()
Dim objWMIService As Object
Dim colItems As Object
Dim objItem As Object
Dim pos&
'---
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'", , 48)
For Each objItem In colItems
  If InStr(1, objItem.commandline, "notepad.exe", vbTextCompare) > 0 Then
  
    MsgBox "Le Bloc-notes est ouvert." & vbCrLf & vbCrLf & objItem.commandline
        'OU uniquement le chemin du fichier ouvert
    pos& = InStrRev(objItem.commandline, Chr(34)) + 1
    MsgBox "Le Bloc-notes est ouvert." & vbCrLf & vbCrLf & Trim(Mid(objItem.commandline, pos&))
    
  End If
Next
End Sub
 

xhudi69

XLDnaute Accro
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour à toutes et à tous,
Bonjour Camarchepas :) job75 :) david84 :) PM02 :)

Vraiment désolé pour le retard, mais mes journées de travail sont très longue.

le code de Camarchepas ne fonctionne pas chez moi :( et il me semble qu'il ne détecte que si un BlocNote est ouvert ou non.

Avec le code de job75 ça fonctionne, mais le code s’appuie sur le nom de la fenêtre, hors à mon post#1, j'avais précisé que le fichier BlocNote est situé sur un serveur, donc pas question pour moi de détecter une fenêtre si un autre utilisateur dans l'entreprise l'a ouvert.

La modif de david84 sur le code de PM02, fonctionne, mais je pense que c'est idem que pour le code de job75

Avec ce code et pour un fichier Word, cela fonctionne quand celui-ci est sur un serveur distant, j'aimerais la même chose avec le BlocNote, mais cela me semble très difficile et je ne suis pas assez calé.
Code:
Sub Bouton9_Clic() 'fichier Word ça fonctionne.....
'Dim Appli As Word.Application
'Dim MonDoc As Word.Document
'Set Appli = CreateObject("Word.Application")
monfichier = "\\ANGE\Mes documents\Test1.doc"
 
'Test de vérification que le fichier n'est pas ouvert
If FileLocked((monfichier)) Then
    MsgBox "Fichier ouvert"
Else
    MsgBox "Fichier fermé"
    Exit Sub
End If
 
'Set MonDoc = Appli.Documents.Open(monfichier)
 
End Sub

Dans tous les cas, un grand merci à vous tous....je continue mes recherches....

@+ :cool:
 

david84

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

La modif de david84 sur le code de PM02, fonctionne, mais je pense que c'est idem que pour le code de job75
Mais non justement si tu as testé le code tu vois bien qu'il te ramène le chemin du fichier et pas seulement le nom de la fenêtre.
Lorsque tu travailles sur un ordinateur distant il te faut alors le préciser.
Dans le cadre de WMI le "." désigne l'ordinateur local. Si l'on veut travailler sur un ordinateur distant il faut alors remplacer "." par "le_nom_de_l'ordinateur". En fonction du réseau il faudra peut-être également préciser certains types de droit, un mot de passe, etc.
Bref c'est tout à fait possible via WMI de piloter un ordinateur distant (c'est même peut-être son principal intérêt) mais comme on ne peut pas tester à ta place c'est difficile d'avancer.
Fais des recherches sur WMI et ordinateur distant pour creuser la question.
A+
 

camarchepas

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour à tous ,

Je pense que ce que tu veux tester en fait ce n'est pas le bloc notes , mais bel et bien le fichier que tu doit utiliser .

Donc voici ce que j'utilise avec succes depuis quelques années, tous comme la détection de fenetres proposées ci dessus.

La portabilité n'est pas toujours simple ....

donc la fonction s'appelle en passant en paramètre le nom long et retourne un tout ou rien euh booleen.

Exemple 1 : Test simple
Code:
sub test 
if FichierUtilisé("e:\loin\tres_loin\biblio\mon_fichier.txt") then msgbox "Fichier indisponible, revenez plus tard" : exit sub

'Opérations liées au fichier txt

end sub

Exemple2 : Boucle d'attente , lors d'un enchainement de traitement par exemple
Code:
sub Test1
     ' Fichier et cible représentent le fichier source et le fichier destination 'A définir pour l'usage désiré

     SetAttr Cible, vbNormal
    'Attente Fichier disponible avec chien de garde ( Sortie si plus de 3 mn d'attente)
       Temps =timer +180
       Do
       Loop Until FichierUtilisé(Cible) = False or Temps<timer
       if FichierUtilisé(cible) then msgbox "Fichier indisponible, revenez plus tard" : exit sub
       Kill Cible
       FileCopy Fichier, Cible
       SetAttr Cible, vbReadOnly

end sub

et donc la fonction
Code:
Public Function FichierUtilisé(NomdeFichier As String) As Boolean
'Vérification fin d'utilisation fichier
'Création le 30-04-2012
'
Dim FichierLibre As Integer
Dim ETAT As Boolean

ETAT = False
If FichierOk("", NomdeFichier) Then
FichierLibre = FreeFile
'Gestion des erreurs
On Error GoTo ErreurFichier
  Open NomdeFichier For Input Lock Read Write As #FichierLibre
  Close #FichierLibre
 GoTo Sortie

'Si erreur d'accès alors le fichier n'est pas disponible
ErreurFichier:
  ETAT = True

Sortie:
On Error GoTo 0
End If
FichierUtilisé = ETAT
End Function
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Bonjour le fil, le forum,

@ xhudi69 : le partage de fichier existe sur Excel ou Word mais pas sur le Bloc-notes.

Dans ces conditions quel est l'intérêt d'utiliser un fichier texte, pourquoi ne pas mettre toutes ses informations dans un fichier partagé Excel ou Word ?

@ camarchepas : testée sur un même ordi, la méthode Open/Close crée bien une erreur sur les fichiers Excel ou Word mais pas sur les fichiers textes...

Bonne journée.
 

job75

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Re,

Cela dit si l'on tient au fichier texte téléchargez les fichiers joints sur le bureau et voyez ces macros :

Code:
Private Sub Workbook_Open()
If Me.ReadOnly Then
  MsgBox "Le Fichier est occupé..."
  Me.Saved = True
  If Workbooks.Count = 1 Then Application.Quit Else Me.Close
End If
End Sub
Code:
Private Sub CommandButton1_Click() 'Ouvrir Bonjour.txt
Dim chemin$, fichier$
chemin = ThisWorkbook.Path & "\" 'pour tester, à adapter
fichier = "Bonjour.txt" 'à adapter
ThisWorkbook.FollowHyperlink chemin & fichier
End Sub
Bien évidemment, dans la réalité :

- le fichier "Bonjour.txt" sera placé en un endroit "secret" du serveur

- le fichier "Ouvre Bonjour.xlm" sera un fichier partagé.

A+
 

Pièces jointes

  • Ouvre Bonjour(1).zip
    19.7 KB · Affichages: 17

job75

XLDnaute Barbatruc
Re : Vérifier si BlocNote ouvert ou fermé

Re,

Bloquons donc la fermeture tant qu'une fenêtre "Bonjour" du Bloc-notes est ouverte :

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

Private Sub Workbook_Open()
If Me.ReadOnly Then
  MsgBox "Le Fichier est occupé..."
  Me.Saved = True
  If Workbooks.Count = 1 Then Application.Quit Else Me.Close
End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.ReadOnly Then Exit Sub
Dim nom$
nom = "Bonjour" 'à adapter
If FindWindow("Notepad", nom & Chr(160) & "- Bloc-notes") Then
  Cancel = True
  MsgBox "Fermez les fenêtres '" & nom & "' du Bloc-notes !", 48
End If
End Sub
Fichiers (2).

A+
 

Pièces jointes

  • Ouvre Bonjour(2).zip
    20.6 KB · Affichages: 18
Dernière édition:

Discussions similaires

Réponses
2
Affichages
272

Statistiques des forums

Discussions
312 113
Messages
2 085 422
Membres
102 886
dernier inscrit
eurlece