none
Fermer une fenêtre

    Question

  • Bonjour tout le monde,

    J'utilise l'extension MinimizeToTray Revived, pour réduire Firefox dans la zone de notification Windows lorsque l'utilisateur demande sa fermeture à l'aide de la croix rouge dans le coin de la fenêtre.

    C'est pratique quand on trouve que Firefox met trop de temps à s'ouvrir, car ça permet de l'avoir tout de suite ouvert.

    Il y a quand même des petites erreurs dans cette extension, qui font qu'on se retrouve avec de plus en plus de fenêtres Firefox réduites dans la zone de notification. En principe un menu contextuel sur chacune d'elles permet de fermer la fenêtre, mais j'ai essayé ça tout-à-l'heure et j'ai fermé la fenêtre que je voulais garder ouverte, en gardant ouverte. une autre

    J'ai donc écrit une application WinForm pour afficher la liste des fenêtres ayant "Firefox" dans leur titre, et fermer celle qui est sélectionnée dans la liste.

    L'affichage se passe très bien, et a été rapide grâce à quelqu'un qui a fourni un module tout prêt ici :

    https://stackoverflow.com/questions/19867402/how-can-i-use-enumwindows-to-find-windows-with-a-specific-caption-title

    Pour ce qui est de la suppression de la fenêtre, j'affiche bien son hWnd et son titre, j'envoie le hWnd à la fonction DestroyWindow, mais l'ennui est que ça ne perturbe pas du tout la fenêtre, qui reste ouverte.  Alors à quoi bon que Ducros se décarcasse ?

    En fait le gars s'appelle FriendlyGuy, mais je pense que les intoxiqués de pub auront saisi l'allusion.

    Pour fermer une fenêtre, l'API s'appelle bien DestroyWindow ?

    ApiViewer me donne ça comme signature :

     [DllImport("user32.dll")]
    private static extern int DestroyWindow (int hwnd);

    J'ai aussi essayé en remplaçant int par IntPtr pour être cohérent avec la valeur retournée par la liste. Avant j'avais fait un cast. Aucun des trois appels ne fonctionne.



    • Modifié Gloops jeudi 8 juin 2017 21:31
    jeudi 8 juin 2017 21:27

Réponses

Toutes les réponses

  • Pour fermer une fenêtre, l'API s'appelle bien DestroyWindow ?


    La façon standard est en envoyant un WM_CLOSE avec PostMessage()

    • Marqué comme réponse Gloops vendredi 9 juin 2017 08:37
    vendredi 9 juin 2017 07:27
  • En effet, la doc de DestroyWindow mentionne plusieurs étapes que manifestement je ne maîtrise pas bien, en revanche le résultat est plus conforme avec

    SendMessage(hWnd, WM_CLOSE, 0, 0)

    puisque cette fois j'obtiens la boîte de dialogue de Firefox pour me demander confirmation.

    J'observe toutefois quelque chose d'un peu particulier : j'ai ouvert deux fenêtres Firefox, dont le module sur stackoverflow me donne les intitulés, mais quand j'en sélectionne une pour demander sa fermeture, c'est l'autre qui me demande confirmation (et inversement).

    Est-ce qu'il n'y a que moi à trouver ça bizarre ?

    J'appréhende le moment où je vais faire un test avec trois fenêtres, car je me rappelle un film, de Laurel et Hardy si je me rappelle bien : le gars essayait d'allumer le feu de gauche, c'était celui de droite qui s'allumait. Ensuite l'inverse, et ça pendant un bon moment. A la fin il essaie d'allumer le feu du milieu, là tout explose et il est projeté en hauteur.


    • Modifié Gloops vendredi 9 juin 2017 08:31
    vendredi 9 juin 2017 08:30
  • Ah mais j'y suis. J'ai alimenté la liste en mettant ça dans la boucle :

                    listBox1.Items.Insert(0, NomFenetre);
    

    Donc forcément, les éléments de la liste sont inversés.

    Bon, la suite semble évidente, merci pour la réponse.

    vendredi 9 juin 2017 08:36