Problème avec GetWindow (pour lister les fenetres)

Résolu
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 18 juil. 2006 à 22:35
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 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

6 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
18 juil. 2006 à 23:03
 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
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 juil. 2006 à 23:17
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
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 juil. 2006 à 17:12
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
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
18 juil. 2006 à 23:28
 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 juil. 2006 à 17:01
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
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 juil. 2006 à 18:12
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
Rejoignez-nous