Clipboard Viewer
Pour avoir en temps réel des informations concernant le changement du contenu du presse-papiers, il faut indiquer à Windows que l'on désire en être informé...
En effet, Windows n'enverra pas de messages aux applications ne l'ayant pas demandées explicitement.
Ensuite, Windows ne retient en mémoire que le dernier programme ayant fait cette demande. Dans le cas où plusieurs programmes en ont fait la demande, ce dernier programme déclaré devra faire suivre le message au programme précédemment déclaré sous Windows qui lui même fera de même avec son prédécesseur ...
En clair, nous allons constituer une chaîne. Il faudra donc pouvoir gérer le cas des maillons qui veulent partir et ceux qui veulent s'ajouter à cette chaîne. et bien sûr, permettre de faire suivre le message sur toute la longueur de la chaîne !
Déclaration sous Windows:
Un programme désirant connaître les changements du contenu du presse-papiers doit faire la demande à Windows. Il doit en fait se déclarer comme étant un Clipboard Viewer (Visualisateur de presse-papiers --- pas très joli comme nom).
Vous utiliserez la fonction SetClipboardViewer qui va attendre le handle de la fenêtre de l'application et qui retournera celui du dernier programme qui s'est déclaré comme visualisant lui aussi le presse-papiers...
hwndNextViewer = SetClipboardViewer (hwnd); que vous pourrez mettre dans WM_CREATE par exemple.
C'est évidemment à partir de ces handles de fenêtres que vous pourrez recevoir les messages et les faire suivre aux autres programmes !
hwndNextViewer
est NULL si l'application est la premiere à se référencer
comme Clipboard Viewer.
Réception du message 'changement du contenu du press-papiers':
A ce moment, WM_DRAWCLIPBOARD sera envoyé à chaque changement du contenu du presse-papiers. Il faudra faire suivre ce message au programme précédemment enregistré via un SendMessage sauf si l'application est la première enregistrée !
case WM_DRAWCLIPBOARD:
if (hwndNextViewer)
SendMessage (hwndNextViewer, WM_DRAWCLIPBOARD,wParam, lParam);
suite du traitement... (InvalidateRect (hwnd, NULL, true) par exemple)
return 0;
Sortir de la chaîne des Clipboard Viewer:
Votre programme peut aussi vouloir sortir de cette chaîne. Pour cela il devra indiquer dans la fonction ChangeClipboardChain son handle de fenêtre et le handle de la fenêtre suivante.
Une des raisons pour devoir sortir de cette chaîne: lorsque notre programme doit s'arrêter. Dans ce cas:
case WM_DESTROY:
ChangeClipboardChain (hwnd, hwndNextViewer);
PostQuitMessage (0);
return 0;
Windows enverra un message WM_CHANGECBCHAIN pour signaler le changement.
Avec wParam le handle de la fenêtre de l'application qui sort de la chaîne des Clipboard Viewer
lParam le handle de la prochaine fenêtre dans la chaîne. Il sera à NULL si l'application qui se retire était la dernière de la liste.
Voici comment interpréter ce message dans la procédure de gestion des messages:
Changement dans la chaîne:
Lorsqu'un programme sort de la chaîne, il faut impérativement informer les programmes afin de réconstituer une chaîne unie de tous les programmes restant.
Comme Windows ne connait pas les programmes, il va envoyer un message au dernier déclaré:WM_CHANGECBCHAIN
wParam contiendra le handle de la fenêtre qui sort de cette chaîne. LOWORD (lParam) étant le handle du programme suivant dans la chaîne.
Si le programme qui reçoit le message, à sa variable hwndNextViewer = wParam, il doit modifier sa variable hwndNextViewer pour pointer sur le chaînon suivant:LOWORD (lParam). La chaîne ne sera alors plus rompue.
Par contre, si hwndNextViewer ne correspond pas à wParam, le programme doit faire suivre le message (SendMessage) au programme suivant à moins que hwndNextViewer soit NULL mais dans ce cas, vous serioez au bout de la chaîne !
Remarque, si wParam est NULL, on peut tout de suite s'arrêter !
case WM_CHANGECBCHAIN:
if (wParam)
{
if (hwndNextViewer == HWND (wParam))
hwndNextViewer = HWND(LOWORD (lParam));
else
SendMessage (hwndNextViewer, WM_CHANGECBCHAIN,wParam, lParam);
}
return 0; // NE PAS OUBLIER !!!
Pour terminer, savoir s'il y a un Clipboard Viewer
Pour le connaître on utilisera GetClipboardViewer() qui retourne le handle du dernier Clipboard Viewer déclaré ou NULL si aucun...
Exemple:
Voici un exemple qui affiche un texte à chaque changement du contenu du clipboard: