Lister les Handles des applications ouvertes

Résolu
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 - 11 août 2008 à 13:21
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 12 août 2008 à 01:33
Bonjour,
Je cherche à faire fonctionner un programme qui liste les handles de toutes les applications ouvertes.
N'etant pas spécialistes des "API" ,je compte sur ce forum pour m'aider.
Voici ma demarche de depart.
J'ai trouvé sur ce forum ce programme en VB6 qui marche bien
---------------------------------------------------------------------------------------------------------------------------------------
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd 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
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long



Private Sub Command1_Click()
 
Dim hWnd As Long
Dim Titre_Fenetre As String * 255
Dim TitreFen As String
Dim j As Long
List.Clear  ' On vide la listbox

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




End Sub

----------------------------------------------------------------------------------------------------------------------------------
Puis j'ai essayé de le modifier un peu en VbNet 2003 et voici ce que j'ai écris

----------------------------------------------------------------------------------------------------------------------------





Private



Declare




Function

GetWindow

Lib



"user32"
(



ByVal
hwnd

As




Long

,

ByVal

wCmd

As




Long

)

As




Long




Private



Declare




Function

GetParent

Lib

"user32" (

ByVal

hwnd

As




Long

)

As




Long




Private



Declare




Function

GetWindowTextLength

Lib

"user32"

Alias



"GetWindowTextLengthA"
(



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




Private



Declare




Function

GetDesktopWindow

Lib

"user32" ()

As




Long



Const

GW_HWNDFIRST = 5



Const

GW_HWNDNEXT = 2




Private



Declare




Function

IsWindowVisible

Lib

"user32" (

ByVal

hWnd

As




Long

)

As




Long




Private



Sub

Button2_Click(

ByVal

sender

As

System.Object,

ByVal

e

As

System.EventArgs)

Handles



Button2.Click




Dim
hWnd

As




Long




Dim
Titre_Fenetre

As




String










Dim
TitreFen

As




String




Dim
j

As




Long



Dim

ret




Dim
PlusEspace

As




Long




PlusEspace = 255 - Microsoft.VisualBasic.Len(Titre_Fenetre) 'espace a rajouter pour avoir 255 caracteres



Me

.List1.Items.Clear()





Do



While

(

Not

Microsoft.VisualBasic.IsDBNull(hWnd))

And

(hWnd <> 0)

'Passe en revue chaque fenêtre




hWnd = GetWindow(GetDesktopWindow, 5)


Titre_Fenetre = Microsoft.VisualBasic.Right(Titre_Fenetre, PlusEspace)



'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 <> Microsoft.VisualBasic.Right(Titre_Fenetre, PlusEspace)

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 = Microsoft.VisualBasic.Left(TitreFen, ret)



'sans les caractères supplémentaires finaux




j = j + 1




If
Val(j) < 10

Then



j = "0" & j




Me
.List1.Items.Add(TitreFen & " [ " & hWnd & " ]")

'stocke le tout dans une listbox




End



If




End



If




hWnd = GetWindow(hWnd, 2)



'cherche la fenêtre suivant




Loop











End





Sub
------------------------------------------------------------------------------------------------------------------------------+







Et cela ne marche pas !
Les problèmes rencontrés sont les suivants
    1 -Remplacer cette declaration vb6 <<Dim Titre_Fenetre As String * 255>> en vbnet
    2- hWnd = GetWindow(GetDesktopWindow, 5) me donne un nombre tres long! Est ce normal ?
    3-hWnd = GetWindow(hWnd, 2)  me donne pas le handle suivant et c'est en fait toujours le meme !

    4-Quand je lance ce programme,il tourne en boucle

Je ne comprends pas ce qu'il se passe.
Est ce que vous pouvez me résoudre ce problème et de corriger ce petit programme pour le faire fonctionner
en VbNet 2003.

Merci d'avance

6 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 août 2008 à 13:37
Bonjour,

Dit mille et une fois sur ce forum (au point que m:ême moi qui ne développe pas en VB.Net le sais maintenant par coeur !) :
En VB.Net : on type en Integer, pas en Long ...
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 août 2008 à 14:52
salut,

non seulement les long en integer, mais si le long est un handle, alors c'est intptr32
de même pour les string utilisés comme buffer, ce n'est pas string*XXX mais l'utilisation d'un stringbuilder

++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
3
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
11 août 2008 à 14:31
Re..
Donc , si j'ai bien compris ,
Je remplace "long" par "Integer" ...et c'est ce que j'ai fais mais cela provoque
un dépassement de capacité.
Pourquoi dans les "API", les déclarations se font en type "long".Je souhaite alors
que l'on m'explique !!!
mais cela ne resouds pas le problème de mon petit programme pour lister les
handles.
Si vous pouvez me trouver une solution ?
Merci
0
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
11 août 2008 à 15:00
Re-re

Merci jmfmarques mais il valais le savoir.
En fait , il faut aussi remplacer "Long" par "Integer" dans les déclarations des API.
Maintenant , j'obtiens des valeurs de Handles (hwnd) correcte.Mais j'ai encore
un souci.Le programme tourne en boucle.
Je suis toujours preneur de solution.

Merci
----------------------------------------------------------------------------









Private



Declare




Function

GetWindow

Lib



"user32"

(




ByVal
hwnd

As




Integer

,

ByVal

wCmd

As




Integer

)

As





Integer




Private



Declare




Function

GetParent

Lib

"user32" (

ByVal

hwnd

As




Integer

)

As





Integer




Private



Declare




Function

GetWindowTextLength

Lib

"user32"

Alias



"GetWindowTextLengthA"

(




ByVal
hwnd

As




Integer

)

As





Integer




Private



Declare




Function

GetWindowText

Lib

"user32"

Alias



"GetWindowTextA"

(




ByVal
hwnd

As




Integer

,

ByVal

lpString

As




String

,

ByVal

cch

As




Integer

)

As





Integer




Private



Declare




Function

GetDesktopWindow

Lib

"user32" ()

As




Integer


Const



GW_HWNDFIRST = 5



Const



GW_HWNDNEXT = 2




Private




Declare




Function

IsWindowVisible

Lib

"user32" (

ByVal

hWnd

As




Integer

)

As




Integer













Private



Sub

Button2_Click(

ByVal

sender

As

System.Object,

ByVal

e

As

System.EventArgs)

Handles




Button2.Click





Dim

i





Dim
hWnd

As





Integer




Dim
Titre_Fenetre

As





String




Dim
TitreFen

As





String




Dim
j

As





Integer


Dim

ret





Dim
PlusEspace

As





Integer




PlusEspace = 255 - Microsoft.VisualBasic.Len(Titre_Fenetre)



Me


.List1.Items.Clear()


hWnd = GetWindow(GetDesktopWindow, 5)




Do



While

(

Not

Microsoft.VisualBasic.IsDBNull(hWnd))

And

(hWnd <> 0)


'Passe en revue chaque fenêtre




i = i + 1

Titre_Fenetre = Microsoft.VisualBasic.Right(Titre_Fenetre, PlusEspace)





'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 <> Microsoft.VisualBasic.Right(Titre_Fenetre, PlusEspace)

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 = Microsoft.VisualBasic.Left(TitreFen, ret)




'sans les caractères supplémentaires finaux





j = j + 1




If

Val(j) < 10

Then




j = "0" & j





Me
.List1.Items.Add(TitreFen & " [ " & hWnd & " ]")


'stocke le tout dans une listbox




End




If




End




If



hWnd = GetWindow(hWnd, 2)




'cherche la fenêtre suivant




Loop











End





Sub

------------------------------------------------------------------------------------------------
0

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

Posez votre question
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
11 août 2008 à 22:36
Bonsoir

Merci PCPT ,
Effectivement , il faut utiliser StringBuilder.Mais j'ai du
chercher 1 heure pour faire fonctionner mon petit programme.

Donc à la place de String(255,0),
j'ai écris MyStringBuilder.Append("0", 255).ToString avec en
déclaration de tête:
   Dim
MyStringBuilder
As
New
System.Text.StringBuilder

Maintenant , je peux lister les Handles et les titres de tous
les applications ouvertes.

A++ 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 août 2008 à 01:33
pense à valider la ou les réponses qui t'ont permis de résoudre le problème ;)

ps : rectification précédent message, INTPTR (et non IntPtr32 qui n'existe pas ^^)
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
Rejoignez-nous