Restitution différée
Lorsque nous avons transmis les données vers le presse-papiers, nous
avons été obligé d'ouvrir un accès à celui-ci
via la fonction OpenClipboard(hwnd); où hwnd est la handle de notre fenêtre.
Cette fenêtre permet en fait au presse-papiers de connaître la fenêtre
qui a transmis dernièrement les données. Si nous avions passé
la valeur NULL, Windows aurait déterminé de lui même l'application.
Mais de prime abord, cela ne semble pas servir à grand chose ! Cependant...
Un des problèmes qui peut être posé, c'est que les données que nous stockons dans le presse-papiers peuvent occupper beaucoup de place (par exemple les images ou les sons) et pire, qu'aucunes applications ne se servent de ces données. Il serait donc plus judicieux de ne transmettre ces données qu'à la demande. Et c'est là tout l'intérêt d'indiquer le handle à OpenClipboard()
Lorsqu'un programme veut récupérer des données via GetClipboardData, Windows regarde si le handle sur la zone mémoire a été positionné ou non lors du SetClipboardData(). Si c'est non (la valeur du handle est NULL), alors il va demander au programme ayant transmis les informations sur les données d'indiquer cette fois-ci un handle correcte sur la zone mémoire contenant les données. C'est donc à ce moment là que nous allons réellement stocker nos données en mémoire. Windows nous demandera alors les informations complémentaires via des messages.
Le premier message étudié est WM_RENDERFORMAT.
A la réception de ce message, nous nous contenterons de copier les données
dans un tampon et de transmettre ce handle à Windows via la fonction
SetClipboardData().
Il ne faut en
aucun cas ouvrir ou fermer le presse-papiers durant cette phase !
Mais notre programme pourra aussi recevoir le message WM_DESTROYCLIPBOARD dans le cas où un nouveau programme appelle la fonction EmptyClipboard() pour transmettre des nouvelles données. En effet, comme le presse papier est vidé, Windows nous informe que les données ne seront plus copiables vers une autre application.
Enfin, si vous fermer votre application alors que des données avec des
handles à NULL existent encore, Windows vous demandera avant de terminer
votre programme de transmettre toutes ces données complètes au
presse papier. Pour cela, vous recevrez le message WM_RENDERALLFORMATS.
Il faudra alors ouvrir le presse-papiers, le vider, mémoriser toutes
les données puis utiliser SetClipboardData avec des handels valides et
enfin refermer le presse-papiers. On ne peut en effet plus gérer de restitution
différée dans ce cas !