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

VB.NET Discussion :

[API .NET ] Récupérer le chemin (l'emplacement) de la fenetre windows au premier plan


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut [API .NET ] Récupérer le chemin (l'emplacement) de la fenetre windows au premier plan
    Bonjour, (j'espère que j'ai poster au bon endroit )

    Je voudrais récupérer le path de la fenetre active (celle qui as le focus) mais je n'ai pas trouvé le bon API.

    Code VB.NET 2005
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Dim a As Integer = GetForegroundWindow
    Ce code permet de récupérer le handle de la fenetre qui as le focus ! Et je cherche à récupérer le chemin d'accès à cette fentre en fonction de son handle (ex : C:\Program Files\MonProgramme)

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Une fois que tu as le handle de ta fenêtre tu peux faire :

    1) GetWindowThreadProcessId() qui retourne l'id du thread (TID) et du processus (PID) ayant créé la fenêtre.

    2) OpenProcess() avec le PID, ce qui te renvoie un handle de process.

    3) GetModuleFileNameEx() avec le handle de process


    Je pense que ça doit fonctionner

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Salut,

    je suis un peu pommer dans les apis tu pourrais me dire ce que je dois mettre dans quoi ? (un exemple ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Declare Function GetWindowThreadProcessId Lib "user32" _
      (ByVal hwnd As Integer, _
        ByVal lpdwProcessId As Integer) As Integer
        Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
        Const PROCESS_QUERY_INFORMATION As Integer = &H400
        Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" ( _
        ByVal hProcess As Integer, _
        ByVal hModule As Integer, _
        ByVal ModuleName As String, _
        ByVal nSize As Integer _
        ) As Integer
    merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Je suis désolé mais je ne connais le VB...

    Par contre, je peux toujours te faire un exemple en C# si c'est le pInvoke qui te gène.

    J'ai fait un rapide truc en C (testé et qui fonctionne) pour te donner une idée :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char* GetProcessPathFromWinHandle (HANDLE hWin, char* pPath, size_t BuffSize)
    {
    	DWORD PID;
    	HANDLE hProcess;
     
    	GetWindowThreadProcessId(hWin, &PID);
    	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
    	GetModuleFileNameEx(hProcess, NULL, pPath, BuffSize);
    	CloseHandle(hProcess);
     
    	return pPath;
     
    }
    Attention, ce code ne fait pas de vérification d'erreur...

    Pour les pInvoke de .NET tu peux toujours voir sur le site adéquat : http://www.pinvoke.net/

    exemple : http://www.pinvoke.net/default.aspx/...ProcessId.html

    Si tu as le moindre problème n'hésites pas

  5. #5
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    ca marche pas ,

    chez moi Hprocess vaut 0 !

    Tu pourrais me donner un exemple en C# car le C je comprends rien !

    EDIT : Precise les types des variables pour etre sur que je me plante pas car en VB.NET c'est pas les meme types...

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    J'ai cherché un moyen pour limiter au maximum les pinvoke. Au final, on peut utiliser une ou deux fonctions de l'API, le reste est managé :

    L'exemple est fait avec notepad (ce dernier doit être démarré)

    Code C# : 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
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
     
    namespace Test
    {
        public static class NativeMethods
        {
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
     
        }
     
        class Program
        {
            static void Main(string[] args)
            {
     
                //ouverture de notepad
                string lpszParentClass = "Notepad";
                string lpszParentWindow = "Untitled - Notepad";
     
                IntPtr ParenthWnd = new IntPtr(0);
     
                //trouve la fenêtre de notepad
                ParenthWnd = NativeMethods.FindWindow(lpszParentClass, lpszParentWindow);
     
                if (ParenthWnd.Equals(IntPtr.Zero))
                    Console.WriteLine("Notepad non trouvé");
                else
                {
                    // affiche le chemin complet
                    Console.WriteLine(GetProcessPathFromWinHandle(ParenthWnd));
                }
            }
            public static string GetProcessPathFromWinHandle(IntPtr hWnd)
            {
                uint pid;
                NativeMethods.GetWindowThreadProcessId(hWnd, out pid);
                Process proc = Process.GetProcessById((int)pid);
                return proc.MainModule.FileName;
            }
        }
    }

  7. #7
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Salut,

    j'ai pas tester ton code mais cela ne correspond pas à ce que je veux faie car dans mon cas c'est le chemin d'une fenetre que je veux récupérer et pas d'une application...

    SInon finalement j'ai tester le code mais ca marche toujours pas ! (peut etre que la conversion n'est pas bonne)

    Il faudrais me donner du code en VB.NET pour tester...

    Je comprends rien du tout à cette histoire !!

    PS: je n'ai pas de problème avec les Pinvoke !

    EDIT : Je pense que c'est ca qui plante : GetWindowThreadProcessId

    En fiat je voudrais faire ca :
    http://www.developpez.net/forums/sho...d.php?t=309763

    Je pense que y'a des problème avec le .NET 2005 de compatibilité et certain api marches pas ! mais es tu sur que tes exemples en C# marchent ?

    De plus, une fenetre windows n'est pas un processus !!! Enfin si c'est explorer.exe mais c'est pas ca que je cherche c'est sans doute pour ca que sa plante...
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  8. #8
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Re bonjour,

    J'ai enfin réussit avec la dernière méthode (problème de Byref dans la déclaration des API) et je récupère bien le process...

    Le problème c'est que je récupère pas l'emplacement de la fenetre active (exemple : E:\Mes docuements\Test) mais je récupère le process associé : C:\Windows\Explorer.exe...

    Donc c'est pas ce que je voulais faire....

    Une idée please !!!

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Public Shared Function GetProcessPathFromWinHandle(ByVal hWnd As Integer) As String
            Try
                Dim pid As Integer
                GetWindowThreadProcessId(hWnd, pid) 'recupère l'ID du process
     
                Dim proc As Process = Process.GetProcessById(pid) 'récupère le Process
     
                Return proc.MainModule.FileName 'Et la ca retrourne pas la bonne valeur !!!
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Function
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Le problème c'est que je récupère pas l'emplacement de la fenetre active (exemple : E:\Mes docuements\Test) mais je récupère le process associé : C:\Windows\Explorer.exe...

    Donc c'est pas ce que je voulais faire....
    Qu'entends-tu exactement par "emplacement de la fenêtre active" ?

    Une fenêtre est créé par un processus et elle n'a donc pas "d'emplacement" si ce n'est tout au plus le chemin du processus associé. Je pensais donc que tu cherchais à récupérer le processus ayant créé cette même fenêtre...

    Apparemment ça n'est pas cela... Que désigne exactement, pour toi, "emplacement" ? Aurais-tu un exemple concret ? Quelle est le type de fenêtre (GetOpenFileName, une textbox, une checkbox , un RichEdit, etc. ) ?

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Slt,

    Un exemple :

    >J'ouvre une fenetre (explorer) C:\Mes documents\Test
    Dans cette fenetre windows il y a donc des dossiers et des fichiers. Si je fais clique droit sur la fenetre puis "propriété" alors dans "emplacement", j'ai le chemin d'accès à la fenetre !

    Ce que je veux faire, c'est récupèrer en fonction de la fenetre (dans mon exemple la fenetre s'apelle Test) son emplacement (dans mon exemple C:\Mes documents\Test)

    Une piece jointe pour t'aider à comprendre : c'est ce qui est selectionner dans "propriété" que je veux récupèrer.

    va voir la : http://www.developpez.net/forums/sho...d.php?t=309763
    En fait le but, c'est de créer un logiciel de copie de fichiers qui remplacerais celui de windows, il faut donc bien récupérer le path de destination des fichiers !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    D'accord j'ai compris maintenant, il fallait tout de même savoir que la fenêtre était celle d'explorer... pas facile à deviner si ce n'est dit nul part.

    Voilà un code complet et qui fonctionne, mais il faudra rajouter les gestions d'erreurs et d'exceptions, je voulais juste faire un code minimal et fonctionnel.

    En fait le but ici est d'énumérer toute les fenêtres (contrôles) d'Explorer jusqu'à trouver une fenêtre ayant un caption contenant celui du titre.

    Pas mal de fonctions non managées mais on ne peut pas faire autrement...

    Il suffit qu'Explorer.exe soit démarré (pas besoin qu'il soit à l'avant plan) et le programme ci-dessous affiche le chemin du dossier actuel d'explorer.

    exemple : je suis dans C:\temp\bla avec explorer. Le titre de la fenêtre d'explorer est "bla", le programme affiche "C:\temp\bla".

    Code C# : 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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
     
    namespace Test
    {
     
        public static class NativeMethods
        {
            // declaration du délégué pour le callback de EnumChildWindows
            public delegate int WindowEnumDelegate(IntPtr hwnd, int lParam);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern int EnumChildWindows(IntPtr hwnd, WindowEnumDelegate del, int lParam);
     
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern int GetWindowTextLength(IntPtr hWnd);
     
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount);
     
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
     
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
            public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
        }
        class Program
        {
            static void Main(string[] args)
            {
                string lpszParentClass = "ExploreWClass";
     
                IntPtr ParenthWnd = IntPtr.Zero;
     
                //trouve la fenêtre de explorer.exe
                ParenthWnd = NativeMethods.FindWindow(lpszParentClass, null);
     
                if (ParenthWnd.Equals(IntPtr.Zero))
                    Console.WriteLine("Explorer non trouvé");
                else
                {
                    // récupère le titre d'explorer.exe
                    string explorerTitle = GetWinText(ParenthWnd);
     
                    // instance de classe
                    EnumWindows ew = new EnumWindows(ParenthWnd, explorerTitle);
                    // récupération du chemin complet
                    ew.GetPathFromExplorerWindow();
     
                    //affiche chemin complet
                    if ((ew.FullPath != null) && (ew.FullPath != string.Empty))
                        Console.WriteLine(ew.FullPath);
                }
            }
            public static string GetWinText(IntPtr hWin)
            {
                int length = NativeMethods.GetWindowTextLength(hWin);
     
                StringBuilder sb = new StringBuilder(length + 1);
     
                NativeMethods.GetWindowText(hWin, sb, sb.Capacity);
     
                return sb.ToString();
            }
        }
        public class EnumWindows
        {
            IntPtr m_hParent;
            string m_title;
            string m_fullPath;
            const int WM_GETTEXT = 13;
            const int WM_GETTEXTLENGTH = 14;
     
            public string FullPath { get { return m_fullPath; } }
     
            public EnumWindows(IntPtr hParent, string explorerTitle)
            {
                m_hParent = hParent;
                m_title = explorerTitle;
            }
            public void GetPathFromExplorerWindow()
            {
                NativeMethods.WindowEnumDelegate callback = new NativeMethods.WindowEnumDelegate(EnumWindow);
     
                NativeMethods.EnumChildWindows(this.m_hParent, callback, 0);
            }
            private int EnumWindow(IntPtr handle, int lParam)
            {
                //Console.WriteLine("handle : {0:x8}", handle.ToInt32());
                string text = this.GetWinText(handle);
                if (!String.IsNullOrEmpty(text))
                {
                    if (text.Contains(this.m_title))
                    {
                        this.m_fullPath = text;
                        return 0;
                    }
                    else
                        return 1;
                }
     
                return 1;
            }
            private string GetWinText(IntPtr hWin)
            {
                StringBuilder sb;
     
                IntPtr pLength = NativeMethods.SendMessage(hWin, WM_GETTEXTLENGTH, 0, null);
     
                int length = pLength.ToInt32();
     
                if (length > 0)
                {
                    sb = new StringBuilder(length + 1);
                    pLength = NativeMethods.SendMessage(hWin, WM_GETTEXT, length+1, sb);
                }
                else
                    return string.Empty;
     
                return sb.ToString();
            }
        }
    }

  12. #12
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Salut,

    le code ne marche pas !

    Deja FindWindows renvoi 0... peut etre que "ExploreWClass" est faux

    Mais bon avec ma methode je peux récupérer le handle de la fenetre active de explorer et son titre (ca marche) j'en suis sur que avec le titre de la fenetre et son handle on peut récupérer son emplacement !

    Par contre l'enumération des fenetres ne marche pas.

    Je sais pas comme ta reussi à faire ca chez toi .....

    Il existe une fonction GetCurrentDirectory mais c'est seulement pour récupérer l'emplacement de l'application moi je voudrais la meme fonction en rajoutant un parametre (Hwnd as Integer) et pouvoir récupérer l'emplacement de la fenetre quelque soit la fenetre selectionnée.

    >EDIT : SI ca marche chez toi, tu peux le compiler ton projet et me l'envoyer en exe (car je pourrais pas le lire) que je teste car d'après ton code tu ne récupère pas l'emplacement de la fenetre mais tu récupère son titre.
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #13
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Deja FindWindows renvoi 0... peut etre que "ExploreWClass" est faux
    J'ai récupérer le nom de la classe avec Spy++, ça n'est peut être pas la même chez toi si ce n'est pas le même O.S.
    Mais même dans ce cas là tu peux rajouter du code pour être sur qu'il s'agit d'explorer.

    j'en suis sur que avec le titre de la fenetre et son handle on peut récupérer son emplacement !
    C'est bien ce que fait mon code, mais sans utiliser la fenêtre de propriétés, juste en prenant le texte qui est dans la barre d'adresse.

    Par contre l'enumération des fenetres ne marche pas.
    Qu'est ce qui ne "marche" pas ?

    Je t'ai déjà expliqué le comportement du code que j'ai collé dans mon précédent message :

    exemple :
    - Je suis dans C:\temp\bla avec explorer.
    - Le titre de la fenêtre d'explorer est "bla".
    - Je lance mon programme et il affiche "C:\temp\bla". (Même si j'ai bien compris que c'est c:\temp\ que tu souhaiterais).
    Il existe une fonction GetCurrentDirectory mais c'est seulement pour récupérer l'emplacement de l'application moi je voudrais la meme fonction en rajoutant un parametre (Hwnd as Integer) et pouvoir récupérer l'emplacement de la fenetre quelque soit la fenetre selectionnée.
    Tes explications sont assez confuses, techniquement "emplacement de fenêtre" n'a pas de sens en soi.

    Si je me réfère à la capture d'écran de ton message et d'après ce que je comprends, pour synthétiser :

    - La fenêtre d'Explorer.exe affiche une vue d'un dossier
    - Tu cherche à récupérer le chemin du parent du dossier affiché

    e.g :

    - Titre de la fenêtre d'explorer : Test
    - chemin dans la barre d'adresse d'explorer: C:\Documents and Settings\Administrateur\Mes Documents\Test
    - Emplacement du dossier : C:\Documents and Settings\Administrateur\Mes Documents\

    D'après ce que je comprend c'est cet emplacement que tu souhaite récupérer, et c'est bien ce que fait mon programme (peu ou prou, il suffit d'enlever le dernier dossier, mon programme ne faisant que récupérer le chemin de la barre d'adresse, c-a-d le chemin complet).


    SI ca marche chez toi, tu peux le compiler ton projet et me l'envoyer en exe (car je pourrais pas le lire)
    Oui le programme fonctionne chez moi du fait que je l'ai quand même testé avant de le mettre sur le forum. Je n'entends pas par là qu'il fonctionne chez toi à coup sûr. Le problème le plus probable étant le nom de la classe parente d'explorer.

    Tu peux faire un simple copié /collé du code source dans visual studio et le compilé, tu pourra alors le débugger pour voir ce qui ne semble pas aller chez toi (étant donné que, je te cite : "le code ne marche pas !"). Si je t'envoi l'exécutable (ce qui en soit est réellement moins sur et sécurisant que le code source) cela ne te montrera en aucun cas où le bas blesse.

    que je teste car d'après ton code tu ne récupère pas l'emplacement de la fenetre mais tu récupère son titre.
    Je récupère le titre pour savoir où et quoi chercher par comparaison avec la chaîne de caractère de la barre d'adresse. Pour reprendre ton exemple :

    - Titre de la fenêtre d'explorer : Test
    - chemin dans la barre d'adresse d'explorer: C:\Documents and Settings\Administrateur\Mes Documents\Test
    "Test" étant dans les deux, je suis sûr qu'il s'agit du bon chemin.

    A moins de m'être fourvoyé et de n'avoir, au fond, pas compris ce que tu cherches (mais là je commence à en douter, ne serait-ce qu'avec l'aide de la capture d'écran), je peux difficilement faire plus.

  14. #14
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Re,

    Je viens de tester ton code en C# (j'ai mis 20 min à le compiler car je connais pas ce langage !) et effectivement ca marche mais à plusieurs conditions :

    - Il faut que explorer soit ouvert
    - Il faut que la barre d'addresse soit activée (chez moi je l'utilise pas c'est pour ca que ca plantait)

    Or dans mon logiciel de copie de fichier, l'utilisateur quand il faut Ctrl + C uis Ctrl + V dans une fenètre explorer, il n'ouvre pas "explorer.exe" et encore moi la barre d'adresse en haut...

    C'est pour ca que moi je veux pouvoir faire exactement ce que tu fais mais sans etre obligé d'ouvrir explorer et sans etre obligé d'ouvrir la barre d'adresse.

    Sinon je sais que j'explique mal car c'est pas facile à expliquer mais si tu allais voir mon post plus haut tu comprendrais que c'est dans le cadre d'un projet où mon but est de remplacer le logiciel de copie de WIndows XP par le mien.

    Donc quand tu copies un fichier d'un répertoire à un autre avec XP, tu fait Ctrl + C puis tu vas dans la fenetre explorer du répertoire où tu souhaites copier le fichier puis enfin tu fait Ctrl + V.

    Et donc la grande question est : Comment récupèrer le chemin de destination ?

    Cdl
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  15. #15
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 365
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 365
    Points : 20 401
    Points
    20 401
    Par défaut
    Pour utiliser FindWindow je crains qu'il faille utiliser des ATOM ; je sais pas si c'est possible d'utiliser ça en .NET.
    Avec GetModuleHandle cela ne fonctionne pas ?

  16. #16
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    J'ai reussi à bidiouiller le code pour résoudre le problème d'explorer. Donc maintenant il reste le problème de la barre d'adresse qui n'est pas résolu, comment faire donc pour récupérer le chemin sans la barre d'addresse (ou alors avec mais meme si celle dernière est fermée) ?

    Mat.M : J'ai plus de problème pour récupérer le Handle de la fenetre. Lis les posts plus haut
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  17. #17
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Je viens de faire le test chez moi, sans barre d'adresse et cela fonctionne quand même, en effet, la barre d'adresse est quand même présente même si elle n'est visible :



    Sur l'image :

    1) Je suis sur le répertoire E:\Appdata\Libs dans explorer.exe
    2) Pas de barre d'adresse.
    3) On voit que la fenêtre est présente, même si je ne l'ai pas affiché (cf. rond bleu dans spy++). menu "vue > barre d'outils > Barre d'adresse" est décoché
    4) Le Handle de la combobox avec le chemin est trouvé par mon programme (cf. rond rouge)
    5) En vert, le chemin trouvé

    Essaye de voir avec Spy++ si la barre d'adresse est présente (sa classe est "ComboBoxEx32"), même si tu ne la voit pas.

    Tu peux afficher les handles des fenêtres trouvées par mon programme (pour comparer avec spy++) en enlevant la mise en commentaire du Console.writeline ici :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           private int EnumWindow(IntPtr handle, int lParam)
            {
                //Console.WriteLine("handle : {0:x8}", handle.ToInt32());
                string text = this.GetWinText(handle);

  18. #18
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Slt,

    Je ne sais pas utiliser SPY ++ est ce un outil de VS ? si oui ou est-il ? car ca se trouve il est pas installer sur mon PC

    Sinon, essaye de faire ca :

    1) Tape dans "executer" : explorer pour l'ouvrir
    2) Desactive la barre d'adresse puis ferme explorer (si elle est deja desactiver alors passe à l'etape 4)
    3) Reouvre le et normalement y'a plus de barre d'adresse.
    4) ouvre ton programme et fait le test et dis moi si ca marche

    Car en fait, si j'ouvre explorer et que je cache la barre d'adresse et bah ca marche !!! par contre si j'ouvre explorer et que la barre d'adresse est deja cachée et bah ca marche plus !!!!

    Bizarre non ?

    EDIT : Y'a pas un moyen de forcer l'affichage de la barre d'adresse par API ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/12/2010, 11h08
  2. Réponses: 2
    Dernier message: 09/09/2009, 11h37
  3. Réponses: 4
    Dernier message: 08/08/2006, 23h33
  4. [VB.NET]récupérer l'emplacement d'un fichier sur \c:
    Par zouhib dans le forum Windows Forms
    Réponses: 20
    Dernier message: 17/05/2006, 11h26
  5. [VB.NET]Récupérer le chemin de l'application
    Par gust dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/12/2005, 16h21

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