dedenet2
Messages postés372Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention22 juillet 2013
-
11 août 2008 à 13:21
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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
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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 ...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
dedenet2
Messages postés372Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention22 juillet 20132 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
dedenet2
Messages postés372Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention22 juillet 20132 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.
dedenet2
Messages postés372Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention22 juillet 20132 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.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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