XL 2016 Fermer une fenetre windows de deuxieme niveau

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")
 

patricktoulon

XLDnaute Barbatruc
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 ;)
 

treza88

XLDnaute Occasionnel
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
 

patricktoulon

XLDnaute Barbatruc
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
 

treza88

XLDnaute Occasionnel
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:DockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
656718 classe--->Afx:DockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
263410 classe--->Afx:DockPane:400000:8:10003:10 :02300469 caption----> ut Lite Modulaire V10.03.6 - USER 1
264084 classe--->Afx:DockPane: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:

treza88

XLDnaute Occasionnel
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:DA1316AD caption--->Afficher
1975174 classe--->AfxFrameOrView140 10003:00000006:DA1316AD caption----> fficher
20907784 classe--->Afx:StatusBar:400000:8:10003:10 :DA1316AD caption----> fficher
5835692 classe--->Afx:DockPane:400000:8:10003:10 :DA1316AD caption----> fficher
17305064 classe--->AfxMDIFrame140 0000:8:10003:10 :DA1316AD caption----> fficher
 

treza88

XLDnaute Occasionnel
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:

Discussions similaires

Réponses
8
Affichages
624

Statistiques des forums

Discussions
312 069
Messages
2 085 041
Membres
102 764
dernier inscrit
nestu