HANDLES DE FENÊTRES ET DE CONTEXTE D'AFFICHAGE

Introduction
Handle de Fenêtre hWnd
Handle de Contexte D'Affichage
Informations sur les fonctions
Conclusion
Téléchargement

Introduction

Les API - Application Programming Interface - vous ouvrent l'accès aux nombreuses fonctions de Windows afin de le contrôler.

Puisque Windows est presque totalement orienté Fenêtres, la majeure partie de ces API sont liées à la manipulation de fenêtres... c'est pourquoi lorsqu'une fenêtre est chargée en mémoire, Windows se charge d'associer à cette fenêtre un Handle de Fenêtre (un identifiant unique de fenêtre permettant à Windows de distinguer les différentes fenêtres en mémoire). Ce Handle de Fenêtre (hWnd, Handle of Window) est ensuite utilisé par Windows et par les autres Applications pour envoyer des messages à la fenêtre.

Il va de même pour le Handle d'un Contexte d'Affichage (hDC, Handle of Device Context) qui est l'identifiant unique d'un contexte d'affichage . Ce contexte d'affichage peut être une image (ex. contrôle Picture) ou même une fenêtre (la partie Client d'une fenêtre).

Handle de Fenêtre

Comme nous l'avons dit plus haut, Windows attribue (arbitrairement ?) un Handle à une fenêtre lors de son chargement et se sert de ce Handle pour envoyer des messages à la fenêtre. Vous comprenez donc très rapidement que ce Handle est un nombre quelconque et non pas le nom de votre fenêtre ni le titre de celle-ci !!

Je vous ferai aussi remarquer que puisque Windows est orienté Fenêtre, tout ce que vous voyez devant votre écran sont en fait des fenêtres.
La barre des tâches, le bureau, l'écran lui-même, les zones de texte (textbox), les boutons... sont des fenêtres pour Windows. Tous possèdent une propriété hWnd.

Obtenir le Handle d'une Fenêtre

Il existe des API et des fonctions Visual Basic vous permettant d'obtenir le handle d'une fenêtre, pour ensuite l'utiliser comme paramètre dans une fonction API afin d'envoyer à ce-dernier des messages.

Nom de Classe de quelques fenêtres Windows

Comme on l'a dit plus haut, la barre de tâches, le bureau, l'écran... sont des fenêtres Windows. Ainsi on peut obtenir leur handle et les manipuler à "notre guise" :^).... Attention! Comme vous le savez avec la vague de virus sortis dernièrement, Windows est très fragile !! Une erreur dans la manipulation de ces fenêtres peut être fatale. Ce qui enchante vraiment beaucoup les hackers d'entre vous qui me lisez (je sais qu'il y'en a) :^)

Certaines fonctions telles que FindWindow et beaucoup d'autres peuvent prendre comme paramètres le Nom de la Classe ou le Titre de la fenêtre pour renvoyer le handle de celle-ci. Voici donc quelques classes de fenêtres Windows:
Barre des Tâches
Classe: "Shell_TrayWnd"         Nom/Titre: "" (aucun)
Bureau
Classe: "Progman"        Nom: "Program Manager"
Explorateur Window
Classe: "ExploreWClass"         Titre: (ça dépend)
Gestion d'energie (ATTN!!)
Classe: "SystemTray_Main"         Titre: "Jauge d'énergie" (pour la version française)
Ecran Entier
Classe: "#32769"        Nom: ""

Handle de Contexte d'Affichage

Comme nous l'avons dit plus haut, Un Contexte d'affichage (Device Context) est la partie graphique (dessin) d'une fenêtre (retenez que les fenêtres peuvent être des contrôles). Ainsi le contrôle Picture, est un contexte d'affichage. Les fenêtres aussi possèdent un contexte d'affichage, la partie de la fenêtre où vous mettez les contrôles (la partie des menus et de barre de titre n'est pas comprise).
Vous remarquez donc que les Handles des Contextes d'Affichage sont étroitement liés au Handles de Fenêtre (au fait, toutes fenêtre qui possède un hWnd possède aussi un hDC).

Il existe des API et des fonctions Visual Basic vous permettant d'obtenir le handle du contexte d'affichage (hDC) d'une fenêtre, pour ensuite l'utiliser comme paramètre dans une fonction API afin d'envoyer à ce-dernier des messages.

Informations sur les fonctions

Vous pouvez obtenir les déclarations des fonctions spécifiées plus haut en utilisant la Visionneuse d'API ("Complément/Gestionnaire de Compléments").

La fonction GetWindow

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Renvoie le handle de la fenêtre trouvée. hwnd désigne "généralement" le handle de votre fenêtre. wCmd peut prendre une de ces contantes:

Private Const GW_HWNDFIRST = 0 ' Première fenêtre
Private Const GW_HWNDLAST = 1 ' Dernière fenêtre
Private Const GW_HWNDNEXT = 2 ' Fenêtre suivante (après celle du hWnd spécifié)
Private Const GW_HWNDPREV = 3 ' Fenêtre précédente
Private Const GW_CHILD = 5 ' Fenêtre fille du hWnd

La fonction FindWindow

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Renvoie le handle de la fenêtre trouvée. lpClassName désigne le nom de la classe de la fenêtre. lpWindowName désigne le nom (souvent titre) de la fenêtre.

La fonction GetForegroundWindow

Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long

Renvoie le handle de la fenêtre active (qui est au premier plan).

La fonction WindowFromPoint

Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

Renvoie la fenêtre qui contient le point (x,y). Ce point est souvent le pointeur de la souris.

La fonction GetDC

Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long

Renvoie le hDC du handle de fenêtre spécifié.

Conclusion

Nous venons de voir comment obtenir le handle (et le hDC) de n'importe quelle fenêtre chargée en mémoire sur le système.

Une fois que vous avez ce handle, vous devenez maître de la situation ! Vous pouvez presque tout faire à ces fenêtres; les fermer, dessiner dessus, les mettre au premier plan, prendre leur menu....
Cependant, pour executer encore toutes ces opérations il faut une bonne connaissance des API qui permettent de le faire.

Présentement, vous savez seulement comment avoir le handle d'une fenêtre, mais vous ne savez pas encore comment manipuler ce handle avec d'autres fonctions :-(.
Pour ne pas vous
vexer, je vous ai préparé un bon code source qui vous permet de changer le bouton Démarrer par un autre bouton que vous avez personnalisé.
J'ai aussi préparé un programme (avec ses sources bien sûr) qui vous permettra de lister tous les handles, les classes, et les titres des fenêtres qui sont chargées en mémoire sur le système. Il ne vous restera plus qu'à les examiner de très près.

Téléchargement

Pour vous accompagner dans la lecture, voici l'ensemble des programmes et listings présentés dans cet article.

StartButton.zip - Téléchargez le zip qui contient le programme qui changer le bouton Démarrer.

Handle.zip - Téléchargez le zip qui contient le programme qui liste toutes les fenêtres en cours.

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]