I. Trouver les Handles▲
Pour trouver le handle de la barre des tâches, on utilise la fonction FindWindow avec comme nom de classe 'Shell_TrayWnd'.
Ce qui donne :
var
Tray: hWnd;
Begin
Tray := FindWindow('Shell_TrayWnd'
, NIL
);
Le handle de la barre des tâches est ainsi récupéré dans la variable Tray. Le bouton « Démarrer » est un enfant de la barre des tâches. Pour obtenir son handle, on se sert de la fonction GetWindow en prenant soin de mettre GW_CHILD pour le paramètre uCmd.
Mais, la barre des tâches possède trois enfants :
- 'Button'(le bouton Démarrer) ;
- 'ReBarWindow32' (la partie centrale) ;
- 'TrayNotifyWnd' (la partie de droite, avec l'heure).
On va donc utiliser une boucle pour trouver 'Button' :
var
Tray, Child : hWnd;
C : Array
[0
..127
] of
Char
;
Begin
Tray := FindWindow('Shell_TrayWnd'
, NIL
);
Child := GetWindow(Tray, GW_CHILD);
While
Child <> 0
do
Begin
If
GetClassName(Child, C, SizeOf(C)) > 0
Then
Begin
If
UpperCase(StrPAS(C)) = 'BUTTON'
Then
Begin
// instructions
End
;
End
;
Child := GetWindow(Child, GW_HWNDNEXT);
End
;
End
;
Le handle correspondant au bouton « Démarrer » est contenu dans Child. Pour obtenir les handles des autres parties de la barre, changez 'Button' par celui désiré ('ReBarWindow32' ou 'TrayNotifyWnd').
II. Petits effets amusants▲
À partir du handle, on peut modifier la barre des tâches. Pour la cacher, on utilise la fonction ShowWindow :
var
Tray: hWnd;
Begin
Tray := FindWindow('Shell_TrayWnd'
, NIL
);
ShowWindow(Tray, SW_HIDE);
On peut aussi cacher le bouton Démarrer, en reprenant l'exemple pour trouver le handle du menu Démarrer. Et on y insère la ligne :
ShowWindow(Child, SW_HIDE);
Pour le réafficher, on remplace SW_HIDE par SW_NORMAL. Cependant, même lorsqu'il est caché, on peut accéder au menu Démarrer par la touche Windows. En effet, le bouton est toujours fonctionnel. Vous en avez marre de ce Menu Démarrer ? Alors, détruisez-le ! Non ! En fait, le fermer suffira… Pour cela, il suffit d'envoyer un message WM_DESTROY à ce bouton :
SendMessage(Child,WM_CLOSE,0
,0
);
Pour le revoir, il faut exécuter le fichier « Explorer.exe ». Hors programme, faites Ctr-Alt-Suppr, sélectionnez « Explorer », puis « Fin de Tâche ». Attendez, la fenêtre « Arrêt de Windows » apparait. Attendez encore jusqu'à ce qu'une autre fenêtre s'ouvre et cliquez sur « Fin de tâches » (je ne sais pas si j'ai été assez clair, sinon, redémarrez Windows (avec Alt-F4) !). En utilisant SW_MAXIMIZE avec le handle du menu Démarrer, le bouton occupe toute la place de la barre des tâches !
Pour le remettre à sa place, là encore, on utilise SW_NORMAL. Essayez avec SW_MINIMIZE. On obtient une petite barre flottante dans la barre des tâches. En double cliquant dessus, elle se retransforme en bouton ! Si vous voulez afficher un texte dans cette petite barre, insérez l'instruction suivante juste avant :
SetWindowText(Child,'CouCou !'
);
Et que diriez-vous de déplacer le bouton Démarrer ? Pour cela, on utilise la fonction MoveWindow. Essayez le code suivant pour voir un le bouton Démarrer qui traverse l'écran ! Vous devez d'abord placer un timer sur votre fiche avec un intervalle très faible (1, par exemple).
procedure
TForm1.Timer1Timer(Sender: TObject);
var
Tray, Child : hWnd;
C: Array
[0
..127
] of
Char
;
x: integer
;
begin
inc(x,2
);
if
x>Screen.Width then
x := -75
;
Tray := FindWindow('Shell_TrayWnd'
, NIL
);
Child := GetWindow(Tray, GW_CHILD);
While
Child <> 0
do
Begin
If
GetClassName(Child, C, SizeOf(C)) > 0
Then
If
UpperCase(StrPAS(C)) = 'BUTTON'
then
MoveWindow(Child,x,0
,75
,19
,true
);
Child := GetWindow(Child, GW_HWNDNEXT);
End
;
end
;
En modifiant les paramètres de MoveWindow, on peut modifier la position et les dimensions du bouton Démarrer.
Vous trouverez ici (8 Ko, en zip) un petit programme qui reprend les principales idées de ce cours. Il permet entre autres de déplacer et de redimensionner le bouton Démarrer. Il permet aussi de cacher, agrandir, réduire toutes les parties de la barre des tâches.
Ceci étant mon premier cours, j'espère qu'il a été suffisamment clair. Je vous conseille vivement de jeter un œil dans l'aide de Delphi, consacrée aux API Windows. Tous les paramètres possibles dans les fonctions telles que ShowWindow, FindWindow, GetWindow et MoveWindow sont expliqués.
Si toutefois, vous avez un problème ou si vous ne comprenez pas, n'hésitez surtout pas à m'écrire.
Tout commentaire, suggestion, remarque ou question sont les bienvenus.
Un mot d'encouragement ou un compliment fait toujours plaisir.
LLB/DeuSSuM