Savoir si une fenetre est une tache


Propriétés du code


Date de création : 25/02/2007 à 19:03:00
8 Commentaire(s)
  MadMatt

 

Présentation


Cette fonction permet de savoir si une fenetre est une tache, c'est à dire si elle apparait dans le task manager.

Elle nécessite la fonction GetWindowClass :
http://vbsystemlibrary.free.fr/code.php?ID=38

 

Code


Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Boolean
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
' Renvoie la fenêtre propriétaire de la fenêtre
Public Const GWL_HWNDPARENT As Long = -8
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long


'---------------------------------------------------------------------------------------
' Procedure : IsTask
' DateTime  : 25/02/2007 18:52
' Author    : Vb System Library
' Purpose  : Renvoie TRUE si la fenêtre est une tâche (apparait dans le Ctrl Alt Suppr)
'              Critères :      - Visible
'                              - Avoir un titre
'                              - Pas de parent
'                              - Pas de propriétaire
'                              - ça ne doit pas etre le TaskManager (Progman)
' Params    : hWnd : Handle de la fenetre
'---------------------------------------------------------------------------------------
Public Function IsTask(ByVal hWnd As Long) As Boolean
    'le fenêtre doit être visible
    If IsWindowVisible(hWnd) And (GetWindowLong(hWnd, GWL_HWNDPARENT) = 0) And Not (GetWindowTextLength(hWnd) = 0) Then
        ' Vérifie que ce n'est pas le TaskManager
        If GetWindowClass(hWnd) <> "Progman" Then
            IsTask = True
        End If
    End If
End Function


 

Historique


Voici l'historique des modifications de ce code :
Le 28/02/2007 par MadMatt : Optimisation

 
 

Modifier le code

Seul les admins et l'auteur du code lui même peuvent modifier ce code.

 

Commentaires


De sebdraluorg le 28/02/2007 à 18:00


Salut mad,

Fonction interessante, mais ici "GetParent(hWnd) = 0) And (GetWindowLong(hWnd, GWL_HWNDPARENT) = 0)"
Tu demandes 2 fois si la fenetre parent a le handle 0 donc tu peux enlever un des deux...

Sinon un boolean as la valeur False par defaut donc il n'est pas necessaire de mettre IsTask = False en debut de fonction ;)

Donc tu devrais pouvoir ecrire directement ceci:

Public Function IsTask(ByVal hwnd As Long) As Boolean

IsTask = IsWindowVisible(hwnd) And _
GetParent(hwnd) = 0 And _
GetWindowClass(hwnd) <> "Progman" And _
Not GetWindowTextLength(hwnd) = 0

End Function

Je viens de tester en enumerant les fenetres j'obtien bien la meme liste que le gestionnaire de taches...

++

 

De MadMatt le 28/02/2007 à 18:06


Salut,
effectivement, il y a double test, j'ai viré le SetParent (en général l'api la plus rapide est la plus compliquée, celle où le travail est le moins maché), à voir laquelle vaux mieux virer.
J'ai suivi tes modifs, la source est mise à jour merci ;)

 

De violent_ken le 11/09/2007 à 18:36


Hello,

le code actuel de la library n'est en fait pas correct : si les fenêtres "énumérées" semblent être bonne, en fait ce n'est pas le cas. Le caption est le bon, mais pas le handle.

En clair, c'est pas "la bonne fenêtre" d'un processus qui est détectée comme étant bonne.

Je mettrais à jour quand j'aurais trouvé !
@+

 

De MadMatt le 11/09/2007 à 23:22


Ah bon ?
c'est curieux en effet, j'ai regardé vite fait le code mais aucune idée.
Comment tu vérifie si le handle correspond bien au caption ? (un autre logiciel ?)

 

De violent_ken le 12/09/2007 à 00:31


Bah en fait, j'ai codé un espèce de taskmgr, et il se trouve qu'il est impossible de récupérer certaines icones de fenêtres depuis les handles des tâches correspondant à ces critères.

En fait, il existe plusieurs fenêtres (pour certains logiciels) qui ont le même caption, mais seule une de ces fenêtres possède une icone (et c'est normalement elle la tâche, mais c'est l'inverse dans notre cas).

Du coup j'ai vu qu'il existerait d'autres critères (récupérer l'état de certains paramètres avec GetWindowLong), mais la encore marche pas pour certaines tâches.

En gros, la liste des caption est bonne, mais la liste des handles me semble pas entièrement juste.
Je vais checker çà demain en envoyant des messages (comme flasher la fenêtre...etc) aux "fausses" taches pour voir si elle réagissent effectivement pas.

 

De violent_ken le 12/09/2007 à 00:33


Pour faire plus rapide :

je fait la liste de toutes les fenêtres ouvertes (taches ou pas taches) et je tente de récupérer les icones de toutes ces fenêtres : résultat, marche pas avec certains handle de fenêtres considérées comme des taches, et marche avec d'autres considérées comme pas des taches (la logique voudrait que ce soit la fenêtre qui possède l'icone qui soit la tache).

@+

 

De MadMatt le 12/09/2007 à 13:46


Ok lol je viens de comprendre

Effectivement, après c'est surement au niveau de cette fonction qu'il doit y avoir une erreur, je sais plus où j'avais retrouvé ces critères. Sinon essaye de voir si les 2 fenetres qui ont le meme caption sont toutes les 2 visibles (enfin laquelle est visible) histoire de confirmer tes soupçons.

 

De violent_ken le 12/09/2007 à 13:54


En fait, toutes les deux sont visibles (!) même si qu'une des deux est affichée.

C'est le (GetWindowLong(hWnd, GWL_HWNDPARENT) = 0) qui n'est pas toujours correct.

 

Ajouter un commentaire


Vous devez être connecté pour pouvoir poster un commentaire.

 
 

Valid HTML 4.01 Transitional Valid CSS

Site web de Vb System Library version 1.3
Developpement et design réalisé par : Matthieu Napoli (MadMatt)
© 2007 Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
Temps d'execution de la page : 0.017 s
www.mnapoli.fr