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().
Image non trouvée !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 !