Problème avec GetWindow (pour lister les fenetres) [Résolu]

MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 18 juil. 2006 à 22:35 - Dernière réponse : MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention
- 19 juil. 2006 à 18:12
Bonjour à tous,
J'y comprend rien, ça m'échappe vraiment la. J'ai le code suivant :
    CurrWnd = GetDesktopWindow()
    CurrWnd = GetWindow(CurrWnd, GW_HWNDFIRST)

Avec bien sur les API GetDesktopWindow et GetWindow déclarée, et GW_HWNDFIRST=0
GetDesktopWindow me renvoie bien le handle du bureau (du moins ça me renvoie pas 0, en l'occurence la c'est 65556)
Et GetWindow derrière ça me renvoie 0...
pourtant bien sur j'ai des fenetres, d'ailleurs en utilisant le handle d'une form vb ça marche...

Quelqu'un aurait-il une solution ??

Merci beaucoup d'avance

Ciaò
[mailto:madmatt_12@msn.com MadMatt]
www.madmatt.fr.st
Afficher la suite 

6 réponses

Répondre au sujet
cs_JMO 1838 Messages postés jeudi 23 mai 2002Date d'inscription 1 avril 2018 Dernière intervention - 18 juil. 2006 à 23:03
+3
Utile
 Bonsoir,

Ci-dessous, un script, en VB6, qui n'est pas de moi (glané-recherché sur ce Forum sous le nom de "remove").
N'ayant, pas VB6, il n'est pas testé. J'essaye de l'adapter en vbs, via excel et wmi.
Il devrait répondre à la question. Il est bien détaillé.

Private GetWindow("Lib "user32" (ByVal hWnd, ByVal wCmd)")
Private GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd, ByVal lpString, ByVal cch)
Private Declare IsWindowVisible Lib "user32" (ByVal hWnd) 'As Long
Private Declare GetDesktopWindow (Lib "user32")' ())' As Long





Dim hWnd
Dim Titre_Fenetre
Dim TitreFen
Dim j



hWnd = GetWindow(GetDesktopWindow(), 5)
Do While (Not IsNull(hWnd)) And (hWnd <> 0) 'Passe en revue chaque fenêtre
Titre_Fenetre = String(255, 0) 'Formate la chaine destinée à accueillir le titre de la fenêtre



ret = GetWindowText(hWnd, Titre_Fenetre, 255) 'récupère le titre de la fenêtre et le nombre de caractères de ce titre
If Titre_Fenetre <> String(255, 0) Then 'Si le titre n'est pas vide
If IsWindowVisible(hWnd) = 1 Then 'Pour ne tenir compte que des fenêtres visibles (regardez ce que ça donne en retirant cette condition)
TitreFen = Titre_Fenetre 'récupère le titre de la fenêtre
TitreFen = Left(TitreFen, ret) 'sans les caractères supplémentaires finaux
j = j + 1
If Val(j) < 10 Then j = "0" & j
List.AddItem TitreFen & " [ " & hWnd & " ]" 'stocke le tout dans une listbox
End If
End If
hWnd = GetWindow(hWnd, 2) 'cherche la fenêtre suivant
Loop



jean-marc
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_JMO
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 18 juil. 2006 à 23:17
+3
Utile
salut

MadM@tt -> je ne vois pas ce que tu veux faire... du moins pas comme çà. il faudrait utiliser EnumChildWindows non?!

sinon après quelques modifs mineures, le code posté par JMO semble presque fonctionnel (résultat pas exaustif)

en syntaxe complète VB6 çà donne :

'mettre une "List" (listbox)
Option Explicit 
'
Private Const GW_HWNDFIRST As Long =  0& 
Private Const GW_OWNER = 4 
'
Private Declare Function GetWindow Lib "user32" _ 
(ByVal hWnd As Long, ByVal wCmd As Long) As Long 

Private Declare Function GetDesktopWindow Lib "user32" () As Long 

Private Declare Function IsWindowVisible Lib "user32" _ 
(ByVal hWnd 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 
'
Dim lhWnd As Long 
Dim Titre_Fenetre As String 
Dim TitreFen As String 
Dim j As Long 

'
Private Sub Form_Load() 
'    Dim CurrWnd As Long
'    CurrWnd = GetDesktopWindow()
'    CurrWnd = GetWindow(CurrWnd, GW_HWNDFIRST)
'    Unload Me
    Call test 
End Sub 
'
'
Sub test() 
    Dim ret As Long 
    lhWnd = GetWindow(GetDesktopWindow(), 5) 
    Do While Not IsNull(lhWnd)) And (lhWnd <> 0)  'Passe en revue chaque fenêtre
        Titre_Fenetre =  String (255, 0)  'Formate la chaine destinée à accueillir le titre de la fenêtre

        ret  = GetWindowText(lhWnd, Titre_Fenetre, 255)  'récupère le titre de la fenêtre et le nombre de caractères de ce titre
        If Titre_Fenetre <> String(255, 0) Then  'Si le titre n'est pas vide
            If IsWindowVisible(lhWnd) =  1 Then  'Pour ne tenir compte que des fenêtres visibles (regardez ce que ça donne en retirant cette condition)
                TitreFen = Titre_Fenetre  'récupère le titre de la fenêtre
                TitreFen =  Left (TitreFen, ret)  'sans les caractères supplémentaires finaux
                j  = j + 1 
                If Val(j) < 10 Then j =  "0" & j 
                List.AddItem TitreFen & " [ " & lhWnd & " ]"  'stocke le tout dans une listbox
            End If 
        End If 
        lhWnd = GetWindow(lhWnd, 2)  'cherche la fenêtre suivant
    Loop 
End Sub

<small> Coloration
syntaxique automatique [AFCK] </small>
       

++
<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de PCPT
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 19 juil. 2006 à 17:12
+3
Utile
salut,

beh toutes j'en sais rien (je t'ai dis, la liste ne me semblait pas exaustive... mais je n'ai pas vérifié chaque item de près...)

Private Const GW_CHILD = 5
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDLAST = 1
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3
Private Const GW_MAX = 5
Private Const GW_OWNER = 4

++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de PCPT
cs_JMO 1838 Messages postés jeudi 23 mai 2002Date d'inscription 1 avril 2018 Dernière intervention - 18 juil. 2006 à 23:28
0
Utile
 Bonsoir,

Je viens de rechercher l'original (en vb6) sur mes postes at home et at job,
que nenni !!! Désolé, j'avais commencé à enler toutes des déclarations (as long...)

PCPT, merci de ta gratitude. !!!!!..

jean-marc
Commenter la réponse de cs_JMO
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 19 juil. 2006 à 17:01
0
Utile
Hello, merci à vous deux,

Le code que vous m'avez passé marche, nickel c'est ce qu'il me fallait. Simplement en fait tout ce que je veux faire, c'est lister toutes les fenetres... basique quoi.
Mais l'api GetWindow a besoin d'un handle pour trouver la première fenetre. ça peut marche sans se casser le crane avec un truc du style :
lhWnd = GetWindow(Form1.hwnd, GW_HWNDFIRST)

Simplement moi mon but c'est de faire un module que je pourrais charger dans plein de prog sans que ça dépende des mes objets, donc je n'ai pas de fenetre dispo pour trouver un handle.
Je pensais donc (comme je l'avais vu une fois sur le site), utiliser le handle du bureau avec GetDesktopWindow...
Mais ça marche pas comme ça :
lhWnd = GetWindow(GetDesktopWindow(), GW_HWNDFIRST)       (GW_HWNDFIRST=0)
en revanche ce que vous m'avez passé marche :
lhWnd = GetWindow(GetDesktopWindow, 5)

Alors j'ai plus que 2 questions promis après c'est fini lol:
A quoi correspond le 5 (à quelle constante en gros) ??
Et est ce que ça va bien me lister toutes le fenetres de windows sans exception ?

Merci beaucoup pour vos réponses, enfin un truc qui marche ! (mais j'aimerais comprendre pourquoi ça marche )
Ciaò
[mailto:madmatt_12@msn.com MadMatt]
www.madmatt.fr.st
Commenter la réponse de MadM@tt
MadM@tt 2215 Messages postés mardi 11 novembre 2003Date d'inscription 16 juillet 2009 Dernière intervention - 19 juil. 2006 à 18:12
0
Utile
Excellent la liste de toutes les constantes, merci. Sinon je vais regarder d'un peu plus près en testant, voir si la liste est complète (mais vu le mot clé : GW_MAX, ça a l'air d'etre bon).

Merci à vous 2 encore une fois

Ciaò
[mailto:madmatt_12@msn.com MadMatt]
www.madmatt.fr.st
Commenter la réponse de MadM@tt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.