Lister les Handles des applications ouvertes [Résolu]

dedenet2 372 Messages postés vendredi 27 juillet 2007Date d'inscription 22 juillet 2013 Dernière intervention - 11 août 2008 à 13:21 - Dernière réponse : PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 11 août 2008 à 13:37
3
Merci
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 ...

Merci jmfmarques 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de jmfmarques
Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 11 août 2008 à 14:52
3
Merci
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  

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de PCPT
dedenet2 372 Messages postés vendredi 27 juillet 2007Date d'inscription 22 juillet 2013 Dernière intervention - 11 août 2008 à 14:31
0
Merci
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
Commenter la réponse de dedenet2
dedenet2 372 Messages postés vendredi 27 juillet 2007Date d'inscription 22 juillet 2013 Dernière intervention - 11 août 2008 à 15:00
0
Merci
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

------------------------------------------------------------------------------------------------
Commenter la réponse de dedenet2
dedenet2 372 Messages postés vendredi 27 juillet 2007Date d'inscription 22 juillet 2013 Dernière intervention - 11 août 2008 à 22:36
0
Merci
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++ 
Commenter la réponse de dedenet2
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 12 août 2008 à 01:33
0
Merci
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  
Commenter la réponse de PCPT

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.