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

Dranreb

XLDnaute Barbatruc
Bonjour.
J'ai bien ça dans une vieille doc :
FindWindow Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Versions :
. Windows 95/98 : Oui
. Windows NT : A partir de 3.1
. Windows 2000/XP : Oui



Description :
Cette fonction permet de rechercher une fenêtre. Elle ne fonctionne que sur les fenêtres principales (pas les filles des MDI).
lpClassName est le nom de la classe qui identifie la fenêtre (rarement connu et donc souvent égal à une chaîne vide).
lpWindowName est le titre (complet) de la fenêtre.
La fonctionne retourne alors le handle de la fenêtre, en cas d'échec, elle renvoie 0.
 

treza88

XLDnaute Occasionnel
Je pilote l'application avec des sendkeys depuis excel pour importer un fichier CSV dans cette application (qui est un logiciel professionnel de débit matière).
Et quand j'ai finit d'importer le fichier je suis sur la fenêtre de deuxième niveau et je continue a travailler dessus manuellement.
Ça me permet d'importer et de basculer sur ce logiciel en automatique.
Du coup cette fenêtre reste ouverte, car je dois retravailler dessus de temps en temps dans la journée.
C'est pour cela qu'au début de mon code d'importation de fichier CSV je veux fermer cette fenêtre en automatique en VBA pour retomber sur la fenêtre principale.
En espérant avoir été clair dans mon explication, sinon demande moi d'autres infos
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Et avec ça ?
VB:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
.../...
Const WM_CLOSE As Integer = &H10
FenRun = FindWindow(vbNullString, "fenetre a fermer")
Call SendMessage(FenRun, WM_CLOSE, 0, 0)
 

treza88

XLDnaute Occasionnel
Merci a vous deux,

Dudu2 je ne comprend pas le &H10 dans le code ci dessous peux tu me l'expliquer ou me donner une info pour comprendre.

VB:
Const WM_CLOSE As Integer = &H10

Sinon patricktoulon je vais faire aussi des recherches sur findwindowex et GetNextWindow pour essayer de les utiliser.
Les API Windows sont quasiment inconnu pour moi donc je rame et j'essaye d'apprendre
 

Dudu2

XLDnaute Barbatruc
@treza88,

Est-ce que tu as essayé le code avec le SendMessage ?


WM_CLOSE est la valeur à envoyer en 2ème argument de la fonction SendMessage de l'API Windows pour fermer la fenêtre.

Il faut bien sûr que cette valeur corresponde à une valeur bien précise:
en VBA Const WM_CLOSE As Integer = &H10 est (presque) l'équivalent du
C++ #define WM_CLOSE 0x0010 que tu trouves dans la documentation Windows pour WM_CLOSE.

J'aurais pu mettre:
en VBA Const WM_CLOSE As Integer = 16 puisque 0x10 = 16.

Ou encore, de manière très peu recommandée car non explicite:
Call SendMessage(FenRun, &H10, 0, 0)
Call SendMessage(FenRun, 16, 0, 0)


Un point d'entrée utile de l'API Windows:
 
Dernière édition:

treza88

XLDnaute Occasionnel
je viens de tester ton code et je dois dire que dans un premier temps j'ai de bon résultat, après je ne peux pas être sur a 100% car quand mon pc a la mémoire qui commence a saturer cela fait généralement buger le code plus facilement, du coup il va falloir que je test sur une semaine pour vérifier.
Par contre, j'avais bien reconnu une forme hexadécimal, mais a quoi correspond ce 16 par rapport a ma fenêtre a fermer, je ne comprend pas.
 

Dudu2

XLDnaute Barbatruc
10 en hexadécimal = 16 en décimal
En VBA si tu codes i = &H10 c'est exactement la même chose que si tu codes i = 16.

En VBA quand tu définis une (valeur) constante:
Const WM_CLOSE As Integer = &H10 ou encore Const WM_CLOSE As Integer = 16.
c'est pour l'utiliser de manière parlante, explicite, claire, signifiante.

Si des valeurs hexadécimales sont utilisées, c'est parce que c'est comme ça dans la documentation et on le reproduit par souci de cohérence.
Si c'est comme ça dans la documentation, c'est parce que l'hexadécimal a des vertus de représentation concentrée des formes binaires où chaque bit a une valeur représentative d'un état (ON/OFF).

Lorsque tu cites cette constante WM_CLOSE c'est comme si tu citais sa valeur (&H10 ou 16)
Seulement c'est beaucoup plus parlant de citer WM_CLOSE que de citer &H10 ou 16 car à la lecture du code on sait de suite que c'est pour demander la fermeture d'une fenêtre (en anglais Windows Message CLOSE), alors que 16 c'est juste un nombre qui ne dit pas ce qu'il fait, même s'il fait la même chose.

La valeur &H10 ou 16 ne tombe pas du ciel.
Comme je te l'ai indiqué dans le message #9 (avec les liens) c'est une valeur qu'on trouve dans la documentation.
2020-07-04_201249.jpg
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'ajouterais juste que bien des codes conventionnels de ce genre, à définir par constantes à noms recommandés en majuscules, ont assez souvent des valeurs exprimées par un seul bit d'un certain poids: &H1%, &H2%, &H4%, &H8%, &h10%, &H20% etc pour 1, 2, 4, 8, 16, 32 etc. afin qu'on puisse en combiner plusieurs par Or ou additions.
 

treza88

XLDnaute Occasionnel
si j'essaie de vous suivre:
VB:
Const WM_CLOSE As Integer = &H10
On défini une constante "WM_CLOSE" qui est un integer de capacité de 16 bits?
je comprend l'utilisation des valeur hexadécimales, mais je veux comprendre pourquoi on utilise la valeur 16 ou &h10, qui est la même chose.
 

Dranreb

XLDnaute Barbatruc
Je dirais que c'est plus documentaire qu'autre chose. J'ai tendance à l'exprimer en hexadécimal pour souligner que c'est l'expression d'une configuration binaire, qu'il illustre mieux. Quelque fois, mais rârement c'est plus parlant. Les codes de couleurs par exemple, se réinterprètent mentalement plus facilement en hexadécimal qu'en décimal.
 

Discussions similaires

Réponses
8
Affichages
632

Statistiques des forums

Discussions
312 182
Messages
2 086 002
Membres
103 084
dernier inscrit
Hervé30120