IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Savoir si une fenêtre est ouverte et la fermer.


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut Savoir si une fenêtre est ouverte et la fermer.
    Bonjour à Tous,

    J’essaie de faire une petite application qui détecte si une fenêtre Windows est ouverte et le cas échéant la ferme.

    Je fais mes essais avec une fenêtre "copie de fichiers" qui du coup change de nom en fonction des fichiers que je copie.
    En gros faudrait regarder si une fenêtre dont le titre commence par "Copie" existe...

    J'ai cherché autour du namespace "Sytem.Diagnostics" mais rien trouvé de concluant. Je penses qu'il faut obligatoirement passé par les API Windows mais je m'en sort pas, si quelqu'un à un petit exemple ça serait vraiment sympas.

    Mon autre piste serait de détecter si un processus System est lancé lorsqu'on copie un fichier et de le killer mais apparement il n'y a pas de processus spécifique pour la copie de fichiers dans windows.

    Je fais tout ça sous en C# sous Visual Studio 2011 Express

    Merci par avance,

    Rémy

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    oui tu as une fonction de l'api win32 qui permet de retrouver une fenêtre par son nom
    http://www.pinvoke.net/default.aspx/user32.findwindow
    par contre je crois qu'il faut le nom exacte

    sinon tu as une fonction pour lister la liste des processus en .net
    http://faqcsharp.developpez.com/?pag...#syst_proclist

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Peut-être ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Process[] procs = Process.GetProcesses();
    foreach (Process proc in procs) if (Proc.ProcessName.StartsWith("xxx")) proc.Kill();
    On peut aussi tester sur Proc.MainWindowTitle au lieu de ProcessName

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Re,

    Tout d'abord merci d'avoir pris le temps de me répondre.

    Concernant le premier lien, j'ai déjà essayé mais je n'y suis pas parvenu.
    Concernant l'utilisation de Process, je viens de tester mais malheureusement ça ne marche pas... Je ne trouve aucun processus qui correspond à "copie de fichiers" et en affichant le nom des fenêtres principales des processus ça ne donne rien mais j'aurai quand même appris que ça existe =)

    Si quelqu'un sait comment faire dans un premier temps pour lister la totalité des noms de fenêtres ouvertes sous Windows ( a mon avis en utilisant les API Windows) ce serait déjà un bon début.

    merci d'avance

    A plus tard

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    si tu fais ça tu la trouve pas lister
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Pour tous les processus en cours sur l'ordinateur local
    	Process[] prc  = Process.GetProcesses();
    je pense que ça répertorie les processus par le nom de l’exécutable et non par le nom de la fenêtre

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Je penses que tu as raison aussi =)

    J'ai trouvé un source C# sur le net qui a l'air de faire le boulot, je suis entrain d'éplucher ça afin de sortir que la partie qui m'intéresse...
    La source permet de lister les occurrences d'internet explorer qui tournent et permet d'en killer une...
    J'ai modifier un peu la source et à l'heure actuelle elle me liste bien la fenêtre "Copie de...", si je m'en sort , je posterai la solution.

    Pour info voici la source :

    http://www.codeproject.com/Articles/...Instances-in-C

    A plus tard

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    J'ai finalement réussit à faire quelque chose qui fonctionne, le code est surement pas le meilleur possible mais le résultat est la.

    Voici le code de l'application Console faisant le boulot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using System;
    using System.Text;
     
     
    namespace ConsoleApplication1
    {
     
        class Program
        {
      public delegate bool EnumDelegate(IntPtr hWnd, int lParam);
     
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool IsWindowVisible(IntPtr hWnd);
     
        [DllImport("user32.dll", EntryPoint = "GetWindowText",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
     
        [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);
     
        [DllImport("user32.dll")]
        public static extern int FindWindow(string lpClassName,string lpWindowName);
     
        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_CLOSE = 0xF060;
     
     
        public static void closeWindow(int handleWindows)
        {       
                SendMessage(handleWindows, WM_SYSCOMMAND, SC_CLOSE, 0);
     
        }
     
        static void Main()
        {
            var collection = new List<int>();
        EnumDelegate filter = delegate(IntPtr hWnd, int lParam)
        {
            StringBuilder strbTitle = new StringBuilder(255);
            int nLength = GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
            string strTitle = strbTitle.ToString();
     
            if (IsWindowVisible(hWnd) && string.IsNullOrEmpty(strTitle) == false)
            {
                if (strTitle.Contains("Copie") || strTitle.Contains("Il reste"))
                {
                     collection.Add(hWnd.ToInt32());  
                }
            }
            return true;
        };
     
        if (EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero))
        {
           foreach (var item in collection)
            {
                closeWindow(item);
            }
        }
      //  Console.Read();
        }
    }
     
        }
    A plus tard,

    Rémy

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    bien joué j'en aurais peut être besoin un jour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment savoir si une fenêtre est déjà ouverte
    Par AngeAbstraction dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/09/2011, 16h02
  2. [Lazarus] [0.9.29] Savoir si une fenêtre est ouverte par ShowModal ou pas
    Par Invité dans le forum Lazarus
    Réponses: 1
    Dernier message: 12/10/2010, 11h13
  3. Comment savoir si une fenêtre est ouverte ?
    Par darksteph dans le forum Qt
    Réponses: 5
    Dernier message: 03/05/2010, 10h52
  4. savoir si une form est ouverte pour la fermer
    Par olibara dans le forum Windows Forms
    Réponses: 25
    Dernier message: 13/05/2008, 19h24
  5. Savoir si une fenêtre est ouverte ou pas
    Par zizoux5 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/09/2007, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo