Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Fermer une fenetre windows de deuxieme niveau

  • Initiateur de la discussion Initiateur de la discussion treza88
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

treza88

XLDnaute Occasionnel
Bonjour a tous,

j'ai un code vba pour fermer une fenêtre Windows, mais il me semble qu'il ne fonction pas toujours correctement, du fait que ma fenêtre est une fenêtre ouverte de deuxième niveau donc le code ne la trouve pet être pas forcement a chaque fois.
Quelqu'un pourrait il me confirmer ou pas qu'il y a bien un problème.
Voici mon code:

VB:
Do

 

        FenRun = FindWindow(vbNullString, "fenetre a fermer")

 

        Call PostMessage(FenRun, WM_CLOSE, 0, 0)

 

        DoEvents

    Loop While FenRun <> FindWindow(vbNullString, "fenetre a fermer")
 
ok
donc maintenant on va connaitre le texte de la caption de chaque fenêtre fille
dim mois si dans le lot tu reconais le tire de la fentre fille que tu veux fermer
VB:
#If VBA7 Then
    Private Declare PtrSafe Function GetWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal uCmd As Long) As LongPtr
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
#Else
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal uCmd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    #End If
Sub testx()
'Application.EnableEvents = True
    Dim fen_Mère&, fen_Fille&, nom$, captext$
    Const WM_SETFOCUS As Long = &H7
    Const WM_CLOSE As Integer = &H10
    nom = Space(100)
    captext = String(120, " ")


    fen_Mère = FindWindow(vbNullString, "fenetre principale")    'adapter le titre de la fenetre ici
    fen_Mère = Application.hwnd   'test avec l'application.hwnd 'directe

    GetClassName fen_Mère, nom, 200       'récupération de la classe de la fenetre mère
    GetWindowText fen_Mère, captext, 200
    'captext = Replace(captext, Chr$(0), vbNullString)
    Debug.Print " fenetre mère " & fen_Mère & " classe --->" & Trim(nom) & " caption--->" & Trim(captext)

    fen_Fille = GetWindow(fen_Mère, 5)    'on passe a l'etage inferieur (les fenetres enfant)
    Do While Not fen_Fille = 0    'on passe en revue  les suivantes dans le meme etage

        GetClassName fen_Fille, nom, 200       'récupération de la classe de la fenetre fille
        nom = Trim(nom)

        GetWindowText fen_Fille, captext, 200  ' récupération du texte de la caption de la fenetre fille
        captext = Trim(captext)

        Debug.Print fen_Fille & " classe--->" & nom & " caption---->" & captext

        fen_Fille = GetWindow(fen_Fille, 2)    ' on passe a la suivante
    Loop


    'Conbient de handle arrive dans la console "debug"??????????????????



    'LAISSER BLOQUE CE QUI SUIT POUR L INSTANT
    'Do While Not fen_Fille = 0'ferme toutes les fenetre fille
    'Call SendMessage(fen_Fille, WM_CLOSE, 0, 0)
    'DoEvents
    'Loop
    'Call SendMessage(fen_fille, WM_CLOSE, 0, 0)'laisser bloqué pour l'instant
    'Call SendMessage(fen_Mère, WM_SETFOCUS, 0, 0)'laisser bloqué pour l'instant


End Sub
on va avancer pas a pas 😉
 
Tout ce que j'ai concerne le fichier excel mais pas les fenêtre de mon logiciel

fenetre mère 397022 classe --->XLMAIN caption--->21 Matiere Podium avec dosseret OSB.xlsm - Excel
3083904 classe--->EXCEL2 caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
331086 classe--->EXCEL2 caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
1836506 classe--->EXCEL; caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
397108 classe--->EXCEL< caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
1574584 classe--->EXCELG caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
853692 classe--->EXCELG caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
1312430 classe--->EXCELG caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
526032 classe--->EXCELG caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
1315416 classe--->EXCEL2 caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
462266 classe--->EXCEL2 caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
265372 classe--->XLDESK caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
2034994 classe--->MsoWork caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
527988 classe--->MsoWork caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
3345352 classe--->MsoWork caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
789550 classe--->MsoWork caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
789596 classe--->MsoWork caption----> 1 Matiere Podium avec dosseret OSB.xlsm - Excel
 
et oui il faut mettre un apostrophe devant cette ligne
fen_Mère = Application.hwnd 'test avec l'application.hwnd 'directe

donc
'fen_Mère = Application.hwnd 'test avec l'application.hwnd 'directe

et oui !!!comme je n'ai pas ton app je me sert de excel pour la démo
faut bien que j'ai un model etant donné que je travaille en aveugle
 
Ok voici le resultat:

fenetre mère 2557478 classe --->Afx:00400000:b:00010003:00000006:02300469 caption--->Mut Lite Modulaire V10.03.6 - USER 1
459884 classe--->Afx:StatusBar:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
524938 classe--->Afx😀ockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
656718 classe--->Afx😀ockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
263410 classe--->Afx😀ockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
264084 classe--->Afx😀ockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
919442 classe--->AfxMDIFrame140 0000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
 
Dernière édition:
Si je fait la même chose avec la fenêtre de titre "Afficher" j'ai ça:

fenetre mère 3482376 classe --->Afx:00400000:b:00010003:00000006😀A1316AD caption--->Afficher
1975174 classe--->AfxFrameOrView140 10003:00000006😀A1316AD caption----> fficher
20907784 classe--->Afx:StatusBar:400000:8:10003:10 😀A1316AD caption----> fficher
5835692 classe--->Afx😀ockPane:400000:8:10003:10 😀A1316AD caption----> fficher
17305064 classe--->AfxMDIFrame140 0000:8:10003:10 😀A1316AD caption----> fficher
 
Une info supplémentaire que je viens de me rendre compte quand je réduit la fenêtre de second niveau de titre Afficher, j'ai accès au menu de la fenêtre principale, ce qui je pense devrait être impossible car la fenêtre fille devrait bloquer l’accès au menu de la fenêtre principale.
Donc je suis en train de me dire que ces deux fenêtre sont indépendante malgré quelle parait être une fille de la fenêtre principale
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
8
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…