Comment fonctionnent le presse-papiers et le glisser-déposer — traiter correctement le transfert de données OLE dans les applications métier

· Mis à jour le: · · Windows, Presse-papiers, Glisser-déposer, OLE, COM, Développement Windows, WinForms, WPF

Historique des révisions (première version, publiée le 21 Aug 2026)
Première publication
Citer cet article(DOI (archive enregistrée): 10.5281/zenodo.22176599)

Les DOI ci-dessous renvoient à des versions déjà archivées et peuvent différer du texte actuel. Pour citer le texte actuel, utilisez l’URL de cette page.

Go Komura (2026). Comment fonctionnent le presse-papiers et le glisser-déposer — traiter correctement le transfert de données OLE dans les applications métier. KomuraSoft LLC. https://comcomponent.com/fr/blog/windows-clipboard-drag-drop-ole-data-transfer/

DOI (archive enregistrée)
10.5281/zenodo.22176599
DOI (dernière version enregistrée)
10.5281/zenodo.22176600

« Lorsque nous collons un tableau d’Excel, la mise en forme se défait. » « Le contenu copié dans notre application n’arrive pas dans Word sous la forme voulue. » « Nous voulons recevoir des fichiers par glisser-déposer. » — De telles demandes reviennent souvent lors de la révision d’applications métier.

Toutes sont des opérations quotidiennes, mais si l’on pense le presse-papiers comme « une boîte qui tient un seul morceau de données », on se trompe sur le mécanisme. En réalité, il place le même contenu dans plusieurs formats à la fois et laisse le côté collage choisir le format qu’il comprend. C’est pourquoi la même copie produit des résultats différents selon l’endroit où on la colle.

Le problème du collage qui échoue une fois la source fermée met en jeu le « rendu différé », qui ne produit les données que lorsqu’elles sont nécessaires. Et le glisser-déposer OLE (D&D) transmet IDataObject, la même représentation de données que le presse-papiers OLE, à travers des interfaces COM. Copier-coller et D&D sont des fonctions liées : elles partagent le format des données et diffèrent par la façon de les transporter.

Cet article s’adresse aux responsables informatiques des PME et aux développeurs d’applications Windows. Il commence par le fonctionnement des formats, examine ensuite les mises en œuvre côté collage, côté copie et côté surveillance, puis passe à la gestion de l’historique, de la synchronisation et de RDP, et aux pièges du D&D OLE.

1. D’abord la conclusion

Trois axes à retenir.

  1. Le côté copie offre plusieurs formats, et le côté collage choisit parmi eux. Les bases sont CF_UNICODETEXT pour le texte, CF_HDROP pour une liste de chemins de fichiers, et le format enregistré « HTML Format » pour le texte mis en forme.1234
  2. Concevoir non seulement le format des données, mais aussi leur validation et leur durée de vie. Valider les données collées comme une entrée externe non fiable. Un côté copie qui utilise le rendu différé implémente aussi la matérialisation à la sortie. Surveiller avec AddClipboardFormatListener et WM_CLIPBOARDUPDATE, et se préparer à la concurrence en lecture par des nouvelles tentatives.5678
  3. Rendre clair jusqu’où les données voyagent et ce qui se passe une fois transmises. L’historique, la synchronisation cloud et la redirection RDP sont des objets de gestion. Le D&D OLE exige une initialisation STA par OleInitialize, et un dépôt depuis un privilège ordinaire vers une application élevée est bloqué par UIPI. De plus, Move est un contrat sous lequel les données d’origine disparaissent.910111213

Pour lire selon l’objectif, commencer par le chapitre ci-dessous.

Problème ou objectif Ce qu’il faut vérifier d’abord Chapitre
Un tableau Excel collé se défait Les formats qu’offre le côté copie et le format que choisit le côté collage Chapitres 2 à 4
Rendre une copie de notre application utilisable dans d’autres applications Offrir plusieurs formats, et conserver les données après la sortie Chapitre 5
Détecter une copie et l’importer automatiquement Enregistrement de l’écouteur et nouvelles tentatives de lecture Chapitre 6
Garder les secrets hors de l’historique, de la synchronisation et de RDP Les formats d’exclusion côté application et la stratégie de l’organisation Section 6.3, chapitre 7
Implémenter le D&D ; cela échoue seulement à l’élévation Initialisation OLE, frontière de privilège, effets et validation des chemins Chapitres 8 et 9

Dans le diagramme, un trait continu marque une relation qui vaut toujours et un trait pointillé une relation conditionnelle (les conditions figurent dans l’explication de chaque relation sur la page de détail). La liste complète des relations (20 au total, avec preuve et niveau de certitude) et les définitions des concepts principaux sont rassemblées sur la page de détail de la carte des connaissances (en japonais). Données : JSON-LD / Turtle

2. Ce qu’est vraiment le presse-papiers — pas « un seul morceau de données » mais « le même contenu dans plusieurs formats »

Le presse-papiers est un mécanisme de partage de données entre applications. Les applications du même bureau peuvent l’utiliser, mais l’unité précise de partage est la station de fenêtres. Une session utilisateur différente ou une session RDP a chacune son propre presse-papiers. Que le copier-coller fonctionne sur RDP vient de ce que la redirection relie les deux (chapitre 7).

Le principe premier est que l’usage est piloté par l’utilisateur. La posture officielle de conception est de ne pas mettre de données ni d’en extraire à l’insu de l’utilisateur.1

Après avoir vidé le presse-papiers, le côté copie place le même contenu dans plusieurs formats, du plus expressif vers le moins expressif.6 Conceptuellement, copier un tableau dans un tableur s’aligne ainsi.

Priorité Format Contenu
1 Format privé de l’application Représentation interne complète, y compris formules et mise en forme (pour coller dans la même application)
2 HTML Format Un fragment HTML qui conserve la structure du tableau et la mise en forme
3 CSV Texte délimité par cellules
4 CF_UNICODETEXT Texte brut séparé par des tabulations
5 Format image Un bitmap de l’apparence du tableau

Ce que le côté collage extrait, c’est le format qu’il comprend dans cette liste. Word obtient un tableau mis en forme et le Bloc-notes du texte séparé par des tabulations, parce que les deux ont choisi des formats différents.

Autrement dit, « le résultat dépend de la destination du collage » n’est pas en soi un bogue. Il faut regarder ensemble l’offre du côté copie et le choix du côté collage.

Comment la même copie produit des résultats différents selon l'endroit où on la colleLe côté copie place le même contenu sur le presse-papiers dans plusieurs formats et le côté collage choisit le format qu'il comprend, de sorte que Word obtient un tableau mis en forme et le Bloc-notes du texte séparé par des tabulationsWord choisit celui-ciLe Bloc-notes choisit celui-ciCôté copie : tableurPresse-papiers (le même contenu dans plusieurs formats)Format privé de l'applicationHTML FormatCSVCF_UNICODETEXTTableau mis en formeTexte séparé par des tabulations

À l’inverse, les plaintes d’ouverture — « la mise en forme se défait », « quelque chose d’étrange se colle » — se ramènent presque toutes à la façon dont l’un des deux côtés choisit ou offre les formats. Le chapitre 4 traite le côté collage et le chapitre 5 le côté copie.

3. Formats standard et formats enregistrés — CF_UNICODETEXT, CF_HDROP, HTML Format

3.1. Formats standard — utiliser le côté Unicode pour le texte

Les formats que le système d’exploitation définit à l’avance s’appellent formats standard. Voici ceux qui reviennent le plus souvent dans les applications métier.2

Format Valeur Contenu
CF_TEXT 1 Texte ANSI (dépendant de la page de codes)
CF_UNICODETEXT 13 Texte Unicode. C’est le format canonique pour le texte
CF_HDROP 15 Une liste de chemins de fichiers (un handle HDROP)
CF_DIB 8 Un bitmap indépendant du périphérique
CF_LOCALE 16 L’identifiant de locale associé au texte

CF_TEXT et CF_UNICODETEXT sont des « formats synthétisés » que le système convertit implicitement l’un en l’autre. La conversion utilise la page de codes associée à CF_LOCALE.2

Cependant, les caractères que l’ANSI ne peut pas représenter se perdent dans la conversion. Si l’on traite des symboles propres à Unicode, des caractères combinants et analogues, s’en remettre à la conversion mène au mojibake. La règle est de standardiser les lectures et écritures de l’application sur CF_UNICODETEXT, ou DataFormats.UnicodeText en .NET.

Conversion implicite entre CF_UNICODETEXT et CF_TEXTL'application ne lit et n'écrit que CF_UNICODETEXT ; le système synthétise CF_TEXT par conversion implicite avec la page de codes de CF_LOCALE. Les caractères que l'ANSI ne peut pas représenter sont abandonnés dans cette conversionLe système convertit implicitement (page de codes de CF_LOCALE)Lectures et écritures de l'applicationCF_UNICODETEXT (canonique)CF_TEXT (ANSI, dépendant de la page de codes)Les caractères non représentables sont abandonnés à la conversion (terreau de mojibake)

3.2. CF_HDROP — les fichiers voyagent comme « une liste de chemins »

CF_HDROP est ce que l’Explorateur de fichiers utilise pour les copies de fichiers et le D&D. La première chose à retenir est que ce qui voyage est une liste de chemins complets, pas les fichiers eux-mêmes.

Une structure DROPFILES se trouve au début du bloc mémoire, suivie de chaînes de chemins séparées par des caractères NUL. Une chaîne vide est placée en dernier, le bloc se termine donc par un « double NUL ». Dans l’en-tête, pFiles est le décalage de début de la liste de chemins et fWide indique si les chaînes sont en Unicode.3

[DROPFILES header: pFiles=start offset of the path list, fWide=1 (Unicode)]
C:\data\a.txt(NUL)C:\data\b.txt(NUL)(NUL)

En code natif on les récupère une par une avec DragQueryFile ; en .NET on les reçoit comme string[] via DataFormats.FileDrop. Le point que « seuls les chemins voyagent, pas les fichiers eux-mêmes » compte aussi pour le D&D aux chapitres 8 et 9.

Structure du bloc mémoire de CF_HDROPUne structure DROPFILES se trouve au début de la mémoire globale ; pFiles donne le décalage de début de la liste de chemins et fWide indique s'il s'agit d'Unicode. Suivent des chemins complets séparés par NUL, se terminant par une chaîne vide comme terminateur double NUL. Seuls les chemins voyagent, pas les fichiers eux-mêmesStructure DROPFILES (pFiles = décalage de début de liste / fWide = 1)C:\\data\\a.txt + NULC:\\data\\b.txt + NULChaîne vide terminale (double NUL)Seuls les chemins voyagent, pas les fichiers eux-mêmes

3.3. Formats enregistrés — RegisterClipboardFormat et « HTML Format »

Les données que les formats standard ne peuvent pas exprimer se partagent comme format enregistré sous un nom que l’on choisit. On passe un nom à RegisterClipboardFormat et on reçoit un identifiant de format. Enregistrer le même nom depuis une autre application donne le même identifiant, s’accorder sur un nom entre applications est donc le point de contact.1

Pour faire passer des données structurées dans sa propre suite d’applications, on utilise un nom qui ne collisionnera pas, par exemple KomuraSoft.Report.RowData.

HTML Format est « de l’UTF-8 avec un en-tête »

Le format enregistré représentatif est « HTML Format », un format de texte mis en forme qui se range aux côtés du RTF. Le corps est du texte UTF-8, mais un en-tête énumérant des décalages d’octets est attaché devant.4

Version:0.9
StartHTML:<byte position where the whole HTML starts>
EndHTML:<byte position where the whole HTML ends>
StartFragment:<byte position where the fragment starts>
EndFragment:<byte position where the fragment ends>
<html><body>
<!--StartFragment--><b>Gras</b> texte du fragment<!--EndFragment-->
</body></html>

Chaque décalage se mesure depuis le début des données, en-tête compris. StartHTML / EndHTML pointent vers l’ensemble du HTML, et StartFragment / EndFragment vers le début et la fin du fragment que l’utilisateur a sélectionné. L’unité est des octets, pas des caractères.

Pour le générer, on l’assemble dans cet ordre.

  1. Réserver les champs de décalage à largeur fixe (par exemple 10 chiffres).
  2. Construire le corps HTML et l’encoder en UTF-8.
  3. Mesurer les positions d’octets après l’encodage et les réécrire dans l’en-tête.

En UTF-8 qui contient du japonais, le nombre de caractères et le nombre d’octets ne coïncident pas. Se tromper ici coupe le début ou la fin au collage dans une autre application.4

Comment l'en-tête de HTML Format se rapporte aux décalagesDans l'en-tête, StartHTML et EndHTML pointent vers l'ensemble du HTML et StartFragment et EndFragment vers le fragment sélectionné par l'utilisateur, tous comme positions d'octets depuis le début des données. Comme le nombre de caractères et le nombre d'octets divergent en UTF-8, on les remplit avec des positions d'octets mesurées après l'encodageEn-tête (Version / StartHTML / EndHTML / StartFragment / EndFragment)HTML entier (StartHTML à EndHTML)Fragment sélectionné (StartFragment à EndFragment)Chaque décalage = position d'octet depuis le début des données (mesurée après encodage UTF-8 et réécrite)

Outre cela, CSV (DataFormats.CommaSeparatedValue en .NET) est aussi couramment utilisé pour les données tabulaires. Pour l’interopérabilité avec Excel, offrir ensemble HTML Format (mis en forme), CSV (valeurs seulement) et CF_UNICODETEXT (séparé par tabulations) convient quelle que soit la destination du collage.

4. Pratiques du côté collage — priorité des formats et validation

4.1. Chercher depuis les formats riches vers le bas

Le côté collage cherche parmi les formats qu’il sait traiter, en commençant par celui qui porte le plus d’information. On peut utiliser l’ordre dans lequel le côté copie a placé les formats, du plus expressif vers le bas, ou indiquer sa propre liste de priorités.6

API Win32 Comment elle choisit
EnumClipboardFormats Énumère dans l’ordre où le côté copie les a placés ; utiliser le premier format reconnu
GetPriorityClipboardFormat Choisit un format disponible dans la liste de priorités que passe le côté collage

En .NET, le branchement ressemble à ceci.

// Collage d'un tableau : chercher du riche vers le brut
var data = Clipboard.GetDataObject();
if (data is null) return;

// Annoncer un format ne garantit pas que la charge utile est un string. N'utiliser
// cette branche que si le type convient aussi ; sinon tomber sur le candidat suivant
if (data.GetDataPresent(DataFormats.Html)
    && data.GetData(DataFormats.Html) is string html)
{
    // Valider l'en-tête HTML Format, puis importer comme tableau
}
else if (data.GetDataPresent(DataFormats.CommaSeparatedValue))
{
    // Importer comme CSV
}
else if (data.GetDataPresent(DataFormats.UnicodeText))
{
    // Importer comme texte séparé par des tabulations
}

C’est la réponse à la plainte d’ouverture qu’un tableau Excel collé se défait. La structure de tableau n’atteint jamais une application qui ne lit que le texte brut. Jusqu’où l’on accepte la liste des formats est une décision de conception du côté collage.

Branchement de collage qui cherche depuis les formats riches vers le basSi HTML Format est présent et que la charge utile est un string, importer comme tableau ; sinon CSV ; à défaut, texte séparé par des tabulations, en descendant depuis le format le plus expressif. Si aucun candidat n'est présent, refuserOuiNonOuiNonOuiNonDémarrer le collageHTML Format présent et charge utile un string ?Valider l'en-tête et importer comme tableauCSV présent ?Importer comme CSVUnicodeText présent ?Importer comme texte séparé par des tabulationsRefuser

4.2. Les données collées sont une entrée externe

On l’oublie facilement, mais le contenu du presse-papiers est d’origine externe, et l’on ne sait pas quelle application l’a placé. Microsoft elle-même avertit dans la documentation du presse-papiers OLE que les données du presse-papiers ne sont pas fiables et qu’il faut les analyser avec soin avant de les utiliser dans l’application.5

La seule présence d’un format ne dit pas que les données peuvent être importées. Vérifier aussi le type de la charge utile réelle, et faire passer les contrôles suivants.

Ce qu’il faut valider Ce qu’il faut vérifier
L’en-tête de HTML Format Si les décalages pointent hors de la plage. Certaines applications émettent des en-têtes cassés
Les valeurs telles que nombres, dates et codes Si elles passent la même validation que la saisie à l’écran
La taille des données Si elle dépasse la limite d’acceptation, comme des images de centaines de mégaoctets ou du texte de millions de lignes

Noter que la matérialisation commence avant que l’on puisse vérifier la taille

Pour se défendre contre d’énormes données, on distingue quelle charge de quelle étape on peut empêcher. GetData en .NET déclenche aussi le rendu différé à l’appel, et pour le texte matérialise jusqu’à une chaîne managée. Vérifier la taille seulement après la récupération n’empêche pas la charge de cette matérialisation.

Si l’on examine avec GlobalSize le HGLOBAL renvoyé par GetClipboardData Win32, on peut se défendre contre le fait de pousser d’énormes données vers la conversion en chaîne managée et l’analyse. Pour les formats à rendu différé, cependant, GetClipboardData lui-même déclenche le rendu. On ne peut pas empêcher la source de copie de matérialiser les données elles-mêmes.

Pour que l’interface ne se fige pas, déplacer la récupération hors du thread d’interface et refuser les données qui dépassent la limite. Même alors, Clipboard en .NET exige STA. Utiliser un thread dédié réglé en STA, pas le pool de threads (MTA) de Task.Run (section 5.1).

L’idée qu’« une valeur qui vient de l’extérieur se valide avant usage, quel que soit son chemin » est la même que celle exposée dans « Ne jamais utiliser telle quelle la valeur décodée d’un QR code ». Le présupposé que coller est sûr parce que c’est une action de l’utilisateur est ce qui mène à l’accident.

Valider les données collées avant de les utiliserLes données prises du presse-papiers passent dans l'ordre par des contrôles de présence du format, de type de charge utile, de limite de taille et de contenu ; si un contrôle échoue, refuser ou tomber sur le format candidat suivantMauvais typeTrop volumineuxInvalideVérifier que le format est présent (GetDataPresent)Vérifier le type de la charge utile (is string / string[])Vérifier la limite de tailleValider le contenu (en-tête, chemins, valeurs)ImporterRefuser / format candidat suivant

5. Pratiques du côté copie — offrir plusieurs formats à la fois, et le rendu différé

5.1. Placer plusieurs formats à la fois

La pratique du côté copie est le miroir de 4.1 : offrir un format riche et un format brut en même temps. Avec le DataObject de WinForms/WPF, cela tient en quelques lignes.14

// WinForms (System.Windows.Forms). WPF a la même forme avec DataObject/Clipboard de System.Windows
var data = new DataObject();
data.SetData(DataFormats.Html, htmlFormatText);       // Chaîne HTML Format avec l'en-tête
data.SetData(DataFormats.CommaSeparatedValue, csv);   // CSV
data.SetData(DataFormats.UnicodeText, plainText);     // Texte brut
Clipboard.SetDataObject(data, copy: true);            // copy:true = conserver après la sortie de l'application

Ici on sépare la condition de thread et la durée de vie après la sortie.

Condition de thread : la classe Clipboard de .NET ne s’utilise que depuis un thread STA.14 Le thread d’interface WinForms/WPF est STA grâce à [STAThread], ce n’est donc en général pas un problème, mais on ne peut pas l’utiliser depuis un thread d’arrière-plan qui n’est pas STA. Le fond est expliqué dans « Les fondamentaux STA/MTA de COM ».

Durée de vie après la sortie : copy: true signifie « conserver après la sortie de l’application ». Le comprendre avec le rendu différé qui suit clarifie pourquoi cette indication est nécessaire.

5.2. Rendu différé — pourquoi « fermer et l’on ne peut plus coller »

Générer chacun de nombreux formats à chaque copie, c’est travailler même pour des formats qui ne sont jamais utilisés. Le mécanisme qui l’évite est le rendu différé (delayed rendering).6

À la copie, on passe NULL comme handle de données à SetClipboardData, en enregistrant non pas les données elles-mêmes mais une promesse de « les produire sur demande ». Lorsque ce format est demandé, WM_RENDERFORMAT arrive à la source de copie, et ce n’est qu’alors que les données sont générées.

À la sortie, transformer la « promesse » en données

Si la source de copie se termine en laissant des formats non rendus, le côté collage ne peut plus recevoir ces données. C’est le problème « fermer la source et l’on ne peut plus coller ».

Avant de se terminer, la source de copie a la responsabilité de répondre à WM_RENDERALLFORMATS et de matérialiser chaque format non rendu. Les formats qui n’ont pas été matérialisés sont perdus lorsque la source de copie se termine.6

Le flux du rendu différé et « fermer et l'on ne peut plus coller »La source de copie n'enregistre qu'une promesse avec un handle NULL et matérialise les données avec WM_RENDERFORMAT lorsqu'une demande arrive. À la sortie elle a la responsabilité de matérialiser chaque format avec WM_RENDERALLFORMATS ; négliger cela et le format est perduMatérialiser avec WM_RENDERALLFORMATSNégliger la matérialisationSource de copie : n'enregistrer qu'une promesse avec SetClipboardData(format, NULL)Le côté collage demande ce formatWM_RENDERFORMAT → générer les données sur placeLa source de copie est sur le point de se terminerLe collage fonctionne encore après la sortieCe format est perdu (fermer et l'on ne peut plus coller)

Sur le presse-papiers OLE, on place un IDataObject avec OleSetClipboard. À ce moment, ce que le presse-papiers détient est un pointeur vers l’objet de données.

Appeler OleFlushClipboard à la sortie matérialise les données sur le presse-papiers, de sorte que le collage fonctionne encore après la sortie.7 Clipboard.SetDataObject(data, copy: true) en .NET spécifie ce comportement « conserver après la sortie ».

Lorsque l’on copie une grande plage dans Excel puis que l’on quitte, l’invite demandant si l’on veut conserver la grande quantité d’informations sur le presse-papiers est la confirmation de cette matérialisation (le flush). Dans sa propre application aussi, concevoir le rendu différé et la matérialisation à la sortie comme un ensemble.

Différer ne garantit pas que l’interface reste réactive

Le rendu différé est une optimisation de performance, mais générer les données demandées s’exécute de façon synchrone dans le traitement des messages. Le compromis est que l’interface se fige si la génération prend du temps.6

6. Pratiques pour surveiller le presse-papiers — écouteur, nouvelle tentative et exclusion de l’historique

6.1. Utiliser AddClipboardFormatListener

Des exigences telles que « détecter la valeur d’un lecteur de codes-barres ou une copie du système métier central et l’importer automatiquement » appellent la surveillance des changements du presse-papiers. Historiquement il y a trois méthodes, mais aujourd’hui une seule bonne réponse.8

Méthode Évaluation
Lire périodiquement sur un minuteur (polling) Gaspilleur, et peut manquer des changements. Ne pas utiliser
SetClipboardViewer (chaîne de visionneuses) Un défaut dans une application de la chaîne casse toute la chaîne. Conservé seulement pour la compatibilité ascendante
AddClipboardFormatListener Recommandé. WM_CLIPBOARDUPDATE est livré à la fenêtre enregistrée
Flux de surveillance du presse-papiersS'enregistrer avec AddClipboardFormatListener à la création du handle, et WM_CLIPBOARDUPDATE arrive quelle que soit l'application qui copie. Lire avec des nouvelles tentatives, et se désenregistrer de façon symétrique avec RemoveClipboardFormatListener à la destruction du handleSe désenregistrer de façon symétriqueOnHandleCreated : AddClipboardFormatListenerAttendreUne application copieWM_CLIPBOARDUPDATE arriveLire avec des nouvelles tentatives (section 6.2)OnHandleDestroyed : RemoveClipboardFormatListener
// Implémentation minimale WinForms
public partial class MainForm : Form
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool AddClipboardFormatListener(IntPtr hwnd);
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool RemoveClipboardFormatListener(IntPtr hwnd);
    const int WM_CLIPBOARDUPDATE = 0x031D;

    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        AddClipboardFormatListener(Handle);
    }

    protected override void OnHandleDestroyed(EventArgs e)
    {
        // Se désenregistrer de façon symétrique, en phase avec destruction et recréation du handle
        RemoveClipboardFormatListener(Handle);
        base.OnHandleDestroyed(e);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_CLIPBOARDUPDATE)
        {
            // Lire Clipboard.GetDataObject() ici et importer si le format est l'un de ceux dont on a besoin
        }
        base.WndProc(ref m);
    }
}

6.2. Réessayer lorsqu’il ne peut pas être ouvert

Une seule fenêtre à la fois peut ouvrir le presse-papiers. Tant qu’un autre processus l’a ouvert, OpenClipboard échoue.6

Juste après WM_CLIPBOARDUPDATE aussi, la source de copie ou une autre application de surveillance peut encore y travailler. Traiter un échec de lecture temporaire comme un événement normal, et ajouter une logique qui attend quelques dizaines de millisecondes et réessaie quelques fois.

Un point à noter en .NET est que les surcharges qui permettent de spécifier un nombre de tentatives et un intervalle n’existent que du côté écriture, SetDataObject. Le côté lecture, GetDataObject et analogues, n’en a pas.

Côté lecture Traitement de la concurrence
WinForms Attraper ExternalException, attendre et réessayer
WPF Attraper COMException, attendre et réessayer

L’attente et la nouvelle tentative à la lecture s’implémentent côté application.

Flux des nouvelles tentatives de lecture du presse-papiersUne seule fenêtre à la fois peut ouvrir le presse-papiers, donc une lecture juste après la notification de changement peut échouer par concurrence avec un autre processus. Sur une exception, attendre quelques dizaines de millisecondes et réessayer ; une fois la limite atteinte, abandonner cette fois et le reprendre à la prochaine mise à jourSuccèsÉchec (une autre fenêtre l'utilise)Réessayer jusqu'à quelques foisLimite atteinteWM_CLIPBOARDUPDATETenter la lectureImporter (validation du chapitre 4)Attendre quelques dizaines de millisecondesAbandonner cette fois (le reprendre à la prochaine mise à jour)

6.3. Le garder hors de l’historique et de la synchronisation — précautions pour les fonctions de copie qui portent des secrets

Windows a un historique du presse-papiers (Win+V) et une synchronisation inter-appareils (presse-papiers cloud), et les données qu’une application place y sont soumises par défaut. Une application dont la fonction de copie porte des secrets tels que mots de passe ou numéros de compte place aussi un format enregistré qui exclut les données de l’historique et de la synchronisation.1

Format enregistré Ce qu’il supprime
ExcludeClipboardContentFromMonitorProcessing Exclut l’ensemble du contenu copié de l’historique et de la synchronisation inter-appareils
CanIncludeInClipboardHistory (DWORD 0) Historique seulement
CanUploadToCloudClipboard (DWORD 0) Synchronisation inter-appareils seulement

Les gestionnaires de mots de passe tiennent les mots de passe copiés hors de Win+V grâce à ce mécanisme. Il suffit de passer le nom à RegisterClipboardFormat pour obtenir un identifiant de format et de le poser à côté des données ordinaires ; cela vaut la peine de l’implémenter dans les applications métier qui traitent des secrets.

7. Le presse-papiers du point de vue informatique — contrôler l’historique, la synchronisation cloud et RDP

Contrôler le contenu copié côté application et décider ce que l’organisation dans son ensemble autorise sont des questions distinctes. Ce qu’un administrateur examine, ce sont trois choses : l’historique, la synchronisation cloud et la redirection RDP.

L’historique du presse-papiers accumule le contenu récemment copié. Le presse-papiers cloud le synchronise entre les appareils connectés avec le même compte Microsoft ou compte Microsoft Entra.10

Aussi pratique que ce soit, cela mène à des résidus et à un débordement : des informations personnelles copiées du système métier central restent dans l’historique, ou le contenu copié sur un PC professionnel se synchronise vers un PC personnel.

7.1. Contrôler l’historique et la synchronisation inter-appareils

Les deux stratégies de contrôle organisationnel sont celles-ci.

Ce qui est contrôlé GPO (Configuration ordinateur > Modèles d’administration > Système > Stratégies du système d’exploitation) Policy CSP (Intune) Par défaut
Historique du presse-papiers Autoriser l’historique du Presse-papiers Experience/AllowClipboardHistory Autorisé
Synchronisation inter-appareils Autoriser la synchronisation du Presse-papiers entre les appareils Privacy/AllowCrossDeviceClipboard Autorisé

Les deux sont disponibles à partir de Windows 10 version 1809 ; lorsqu’elles sont désactivées, les éléments correspondants de l’application Paramètres sont grisés, et la stratégie prend effet immédiatement.910

7.2. Contrôler le transfert entre sessions RDP

La redirection du presse-papiers de RDP (Bureau à distance) relie le PC local et la session distante. Comme le copier-coller fonctionne par défaut, cela peut aussi devenir un chemin pour emporter des secrets hors d’un serveur.

Le paramètre qui bloque les deux directions est la stratégie « Ne pas autoriser la redirection du Presse-papiers » (valeur de Registre fDisableClip).11

Les versions récentes de Windows Server et de Windows 11 ont aussi ajouté des stratégies de contrôle plus fin, comme limiter seulement la direction serveur vers client au texte. Interdire tout net ou restreindre direction et format par étapes est un équilibre entre exploitation et sécurité.

Chemins par lesquels le contenu du presse-papiers se répand, et les points de contrôleLe contenu copié est soumis par défaut à l'historique et à la synchronisation cloud, et sur RDP il passe vers une autre session par redirection. Chacun peut se contrôler par stratégie, et le côté application peut exclure le contenu de l'historique et de la synchronisation avec les formats d'exclusionPresse-papiersHistorique (Win+V)Synchronisation cloud → autre appareilRedirection RDP → autre sessionContrôle : AllowClipboardHistoryContrôle : AllowCrossDeviceClipboardContrôle : fDisableClipCôté application : exclure avec ExcludeClipboardContentFromMonitorProcessing et analogues (section 6.3)

8. Le glisser-déposer est COM — IDataObject + IDropSource + IDropTarget

8.1. Les mêmes données que le presse-papiers, transportées autrement

Le glisser-déposer OLE s’appuie sur les trois parties suivantes.15

Rôle Mis en œuvre par Travail
IDataObject Source de glissement Les données transportées. Le même objet de données multi-formats que le presse-papiers
IDropSource Source de glissement Décider si le glissement continue ou est annulé, et le retour visuel du curseur
IDropTarget Cible de dépôt Déclarer l’acceptation et recevoir les données dans DragEnter/DragOver/DragLeave/Drop

Le déroulement est le suivant.

  1. La source de glissement appelle DoDragDrop, ce qui démarre la boucle de glissement.
  2. Lorsque la souris entre dans une fenêtre cible de dépôt, IDropTarget est notifié.
  3. La cible de dépôt déclare si elle accepte, et au dépôt récupère le format dont elle a besoin depuis IDataObject.

La documentation officielle explique aussi que le D&D offre la même fonctionnalité que le copier-coller du presse-papiers, et qu’une application qui implémente déjà le copier-coller n’a besoin que d’un petit ajout.15 Autrement dit, le DataObject multi-formats préparé aux chapitres 2 à 5 est aussi les données que le D&D transporte.

Flux du glisser-déposer OLELa source de glissement appelle DoDragDrop avec un IDataObject comme charge et la boucle de glissement commence ; l'IDropTarget de la cible de dépôt déclare l'acceptation dans DragEnter et DragOver, et au Drop choisit et récupère un format depuis l'IDataObjectDoDragDropLa souris entre dans la fenêtreBouton relâchéSource de glissement : IDataObject + IDropSourceBoucle de glissementIDropTarget.DragEnter/DragOver (déclarer l'Effect à chaque fois)IDropTarget.DropChoisir et récupérer un format depuis l'IDataObject

8.2. OleInitialize (STA) est obligatoire

Une fenêtre cible de dépôt s’enregistre avec RegisterDragDrop. Comme prérequis, vérifier deux choses : l’initialisation OLE et le traitement des messages.

Utiliser OleInitialize pour l’initialisation. Si l’on utilise CoInitialize / CoInitializeEx à la place, RegisterDragDrop échoue avec E_OUTOFMEMORY. OleInitialize initialise COM en STA.12

Le thread qui enregistre doit exécuter une pompe à messages. Le D&D OLE est une fonction enracinée dans les fenêtres et le traitement des messages ; le négliger et d’autres applications se bloquent pendant un glissement.12 Le fond est le même modèle de threads que dans « Les fondamentaux STA/MTA de COM ».

En WinForms/WPF, recevoir par les événements

En WinForms/WPF, le framework prend en charge l’initialisation OLE et les implémentations d’interfaces. Le développeur écrit la déclaration d’acceptation et l’import réel dans les événements.

// WinForms : accepter des fichiers déposés
listView1.AllowDrop = true;
listView1.DragEnter += (s, e) =>
{
    // Vérifier aussi que la source autorise Copy (certaines sources n'autorisent que Move/Link)
    e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop)
            && (e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy
        ? DragDropEffects.Copy      // Accepter : recevoir comme une copie
        : DragDropEffects.None;     // Ne pas accepter
};
listView1.DragDrop += (s, e) =>
{
    // Les données de glissement sont aussi une entrée externe. Même si FileDrop est annoncé, la
    // charge utile peut être null ou d'un autre type, et la récupération elle-même peut échouer
    object data;
    try { data = e.Data.GetData(DataFormats.FileDrop); }
    catch (COMException) { return; }
    if (data is not string[] paths) return;
    foreach (var path in paths)
    {
        // Valider le chemin avant d'importer (section 9.3)
    }
};

Le tableau est le même en WPF. Recevoir avec AllowDrop="True" sur l’élément et les événements DragOver / Drop, et récupérer le tableau de chemins avec e.Data.GetData(DataFormats.FileDrop).

Déclarer l’acceptation (l’Effect) à chaque fois dans DragEnter / DragOver est la convention de IDropTarget. L’omettre et le curseur reste sur « non autorisé ». Vérifier non seulement si le format est présent mais aussi, comme dans l’exemple de code, si la source de glissement autorise Copy.

9. Pièges du D&D — élévation, Move et validation des chemins

9.1. On ne peut pas déposer sur une application élevée en administrateur

Déposer un fichier depuis l’Explorateur de fichiers sur une application lancée avec « Exécuter en tant qu’administrateur » et rien ne se passe — ce n’est pas une erreur d’implémentation mais une conception du système d’exploitation. UIPI (User Interface Privilege Isolation) bloque par défaut les messages d’un processus de plus basse intégrité vers une fenêtre de plus haute intégrité, donc les notifications de dépôt de l’Explorateur de fichiers à privilège ordinaire (intégrité moyenne) n’atteignent jamais une application élevée.13

Comment UIPI bloque un dépôt sur une application élevéeUIPI bloque par défaut la notification de dépôt de l'Explorateur de fichiers d'intégrité moyenne vers une application élevée d'intégrité haute, donc elle n'arrive jamais. Garder l'interface à privilège ordinaire et isoler le travail privilégié, et le dépôt arriveNotification de dépôtBloqué (par défaut)PasseDéléguer seulement le travail privilégiéExplorateur de fichiers (intégrité moyenne)UIPIApplication élevée (intégrité haute) : aucune réponseInterface à privilège ordinaire : le dépôt arriveProcessus séparé isolant le travail qui a besoin d'élévation

Il existe aussi une solution de contournement qui autorise individuellement WM_DROPFILES et des messages analogues avec ChangeWindowMessageFilterEx.13 Cependant, c’est une contre-mesure pour l’ancienne notification de dépôt via WM_DROPFILES, et elle ne résout pas le D&D OLE dans son ensemble.

La ligne directrice de fond est de ne pas exécuter l’application élevée en permanence. Si l’on isole seulement le travail qui a besoin d’élévation dans un processus séparé, l’interface elle-même peut rester à privilège ordinaire et accepter le D&D. La conception de l’isolation est détaillée dans « Comment isoler concrètement, dans une application Windows, uniquement les opérations nécessitant des privilèges administrateur ».

9.2. Ce que signifie DragDropEffects — Move est un contrat selon lequel « l’original disparaît »

Copy / Move / Link dans DragDropEffects ne sont pas une décoration de curseur ; c’est un contrat entre la source de glissement et la cible de dépôt.

La source de glissement déclare dans DoDragDrop l’ensemble des effets qu’elle autorise, et la cible de dépôt choisit l’effet réel. Par convention, lorsque Move est convenu, la source de glissement supprime les données (le fichier).

Si le côté réception renvoie Move sans y penser, on aboutit à « j’ai déposé et le fichier d’origine a disparu ». Pour les imports dans les applications métier, faire du Copy explicite du côté réception la valeur sûre par défaut.

Le contrat de DragDropEffects — avec Move, l'original disparaîtLa source de glissement déclare dans DoDragDrop l'ensemble des effets qu'elle autorise, et la cible de dépôt choisit l'effet réel. Parce que la convention est que la source de glissement supprime le fichier lorsque Move est convenu, un côté réception qui importe devrait indiquer Copy explicitementCopyMoveSource de glissement : déclarer les effets autorisés (Copy | Move | Link)Cible de dépôt : choisir l'effet réelLe fichier d'origine reste (le côté sûr pour les imports)La source de glissement supprime le fichier — d'où vient « l'original a disparu »

9.3. Valider les chemins déposés

Ce qui voyage dans CF_HDROP/FileDrop, ce sont seulement des chemins (section 3.2). Avant d’importer, les faire passer par la même validation qu’une entrée externe, comme pour le collage.

  • Fichier ou dossier : Décider en spécification ce qui se passe lorsqu’un dossier entier est déposé (importer récursivement, ou refuser).
  • Espaces réservés OneDrive : Si le chemin existe mais que le corps du fichier n’est pas local — un fichier à la demande —, un téléchargement démarre dès l’ouverture, et il échoue hors ligne. Pour le comportement et les contre-mesures, voir OneDrive « Fichiers à la demande » et applications métier.
  • Chemins longs et particuliers : N’accepter les chemins au-delà de MAX_PATH, les chemins réseau (UNC) et les chemins sur support amovible qu’après confirmation que le traitement en aval peut les gérer.
  • Nombre et taille totale : Pour qu’un dépôt de milliers de fichiers ne fige pas l’interface, rendre l’import asynchrone et ajouter une limite et un affichage de progression.

10. Synthèse

  • Le presse-papiers est un mécanisme qui place le même contenu dans plusieurs formats à la fois dans une zone unique partagée au sein du même bureau (station de fenêtres). Parce que la destination du collage choisit le format, la même copie produit des résultats différents.
  • Le texte est CF_UNICODETEXT, les fichiers sont CF_HDROP, et le texte mis en forme est le format enregistré HTML Format (en-tête de décalages d’octets + UTF-8).
  • Le côté collage cherche les formats du riche vers le brut et valide le contenu comme entrée externe. Le côté copie offre plusieurs formats à la fois, et s’il utilise le rendu différé, implémente aussi la matérialisation à la sortie (WM_RENDERALLFORMATS / OleFlushClipboard).
  • La surveillance est AddClipboardFormatListener + WM_CLIPBOARDUPDATE. Se préparer à la concurrence d’OpenClipboard par des nouvelles tentatives, et exclure les secrets de l’historique et de la synchronisation avec ExcludeClipboardContentFromMonitorProcessing et analogues.
  • L’informatique peut contrôler l’historique du presse-papiers, la synchronisation cloud et la redirection RDP via GPO/Intune. Tous sont autorisés par défaut, donc décider délibérément dans les environnements qui traitent des secrets.
  • Le D&D est COM : IDropSource/IDropTarget transmettent le même IDataObject que le presse-papiers. RegisterDragDrop exige OleInitialize (STA).
  • Les dépôts sur une application élevée sont bloqués par UIPI. Move dans DragDropEffects est un contrat selon lequel « l’original disparaît », et les chemins déposés se valident avant l’import.

Pour les utilisateurs, copier-coller et D&D sont des fonctions aussi peu remarquables que l’air. C’est précisément pourquoi l’expérience souffre tant lorsque surviennent « impossible de coller », « ça se défait » ou « ça a disparu » — et inversement, une application qui offre plusieurs formats et traite les dépôts à fond rend à elle seule le quotidien plus fluide. J’espère que cela sert d’élément de jugement lorsque vous pesez la priorité des révisions.

Articles connexes

Domaines de conseil associés

KomuraSoft LLC prend en charge la conception et l’implémentation du copier-coller et du glisser-déposer dans les applications métier (offre de plusieurs formats, interopérabilité Excel, import de fichiers déposés), l’investigation des causes de défauts tels que « ça se défait au collage » ou « la copie disparaît », l’automatisation de saisie par surveillance du presse-papiers, et l’implémentation de protections d’informations confidentielles vis-à-vis de l’historique et de la synchronisation. Les dossiers qui touchent les couches basses de COM et d’OLE sont les bienvenus même s’ils commencent par isoler le symptôme.

Références

  1. Microsoft Learn, Clipboard Formats. Sur le fait qu’une fenêtre peut placer la même information dans plusieurs formats de presse-papiers ; les formats enregistrés via RegisterClipboardFormat (enregistrer le même nom renvoie la même valeur, les applications peuvent donc le partager) ; les formats synthétisés ; et l’exclusion de contenu de l’historique du presse-papiers et de la synchronisation cloud avec ExcludeClipboardContentFromMonitorProcessing, CanIncludeInClipboardHistory et CanUploadToCloudClipboard. ↩ ↩2 ↩3 ↩4

  2. Microsoft Learn, Standard Clipboard Formats. Sur les définitions des formats standard CF_TEXT (ANSI), CF_UNICODETEXT, CF_HDROP, CF_DIB et CF_LOCALE, et sur la conversion implicite par le système entre CF_TEXT et CF_UNICODETEXT avec la page de codes associée à CF_LOCALE. ↩ ↩2 ↩3

  3. Microsoft Learn, Shell Clipboard Formats. Sur le fait que CF_HDROP se compose d’une structure DROPFILES plus un tableau de chaînes de chemins complets terminé par un double NUL ; la récupération de chemins individuels avec DragQueryFile ; et le fait que les formats shell CFSTR_ exigent un enregistrement via RegisterClipboardFormat. ↩ ↩2

  4. Microsoft Learn, HTML Clipboard Format. Sur le fait que le nom enregistré est « HTML Format » ; la structure d’en-tête avec des décalages (en octets) tels que Version, StartHTML, EndHTML, StartFragment et EndFragment ; le fait que l’encodage est toujours UTF-8 ; et la convention de commentaires StartFragment/EndFragment. ↩ ↩2 ↩3

  5. Microsoft Learn, OleGetClipboard function (ole2.h). Sur la façon d’obtenir un IDataObject depuis le presse-papiers, et sur l’avertissement que les données du presse-papiers ne sont pas fiables et doivent être analysées avec soin avant que l’application les utilise. ↩ ↩2

  6. Microsoft Learn, Clipboard Operations. Sur le fait qu’une seule fenêtre à la fois peut ouvrir le presse-papiers ; le placement des formats du plus expressif vers le bas à la copie ; le choix de format au collage avec EnumClipboardFormats / GetPriorityClipboardFormat ; le rendu différé en passant NULL à SetClipboardData et les responsabilités WM_RENDERFORMAT / WM_RENDERALLFORMATS ; et les compromis du rendu différé. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  7. Microsoft Learn, OleFlushClipboard function (ole2.h). Sur le fait qu’après OleSetClipboard le presse-papiers ne détient qu’un pointeur vers l’objet de données ; le fait qu’OleFlushClipboard matérialise les données sur le presse-papiers de sorte que le collage reste possible après la sortie de l’application ; et le vidage du presse-papiers avec OleSetClipboard(NULL) lorsqu’il n’est pas nécessaire de conserver les données à la sortie. ↩ ↩2

  8. Microsoft Learn, Using the clipboard. Sur la comparaison des trois façons de surveiller le presse-papiers (fenêtres visionneuses, numéros de séquence et écouteurs de format) ; le fait que les nouveaux programmes doivent utiliser un écouteur via AddClipboardFormatListener ; le fait que la chaîne de visionneuses est vulnérable aux manques d’entretien de la chaîne ; et le fait que les numéros de séquence ne sont pas quelque chose à interroger. ↩ ↩2

  9. Microsoft Learn, Policy CSP - Experience. Sur l’autorisation ou le blocage de l’historique du presse-papiers avec la stratégie Experience/AllowClipboardHistory ; la disponibilité à partir de Windows 10 version 1809 ; le fait que la valeur par défaut est autorisé ; et le mappage GPO sous « Système > Stratégies du système d’exploitation » avec des changements qui prennent effet immédiatement. ↩ ↩2

  10. Microsoft Learn, Policy CSP - Privacy. Sur l’autorisation ou le blocage de la synchronisation inter-appareils du presse-papiers avec la stratégie Privacy/AllowCrossDeviceClipboard ; le fait que la synchronisation a lieu entre les appareils connectés avec le même compte Microsoft ou compte Microsoft Entra ; et le fait que la valeur par défaut est autorisé. ↩ ↩2 ↩3

  11. Microsoft Learn, Policy CSP - ADMX_TerminalServer. Sur le fait que TS_CLIENT_CLIPBOARD (« Ne pas autoriser la redirection du Presse-papiers », valeur de Registre fDisableClip) peut interdire le partage du presse-papiers entre local et distant dans une session Bureau à distance, et sur le fait que la redirection est autorisée par défaut. ↩ ↩2

  12. Microsoft Learn, RegisterDragDrop function (ole2.h). Sur la façon d’enregistrer une fenêtre cible de dépôt et son IDropTarget ; le fait que l’appel échoue toujours avec E_OUTOFMEMORY lorsque COM a été initialisé avec CoInitialize/CoInitializeEx, de sorte qu’OleInitialize est obligatoire ; et le fait que l’application source de glissement se bloque lorsque le thread appelant n’exécute pas de pompe à messages. ↩ ↩2 ↩3

  13. Microsoft Learn, ChangeWindowMessageFilterEx function (winuser.h). Sur le fait qu’UIPI est un mécanisme de sécurité qui bloque par défaut la réception de messages d’un expéditeur de plus basse intégrité, et sur l’autorisation de messages spécifiques (MSGFLT_ALLOW) avec un filtre de messages par fenêtre. ↩ ↩2 ↩3

  14. Microsoft Learn, How to add data to the Clipboard (Windows Forms). Sur le placement de données dans plusieurs formats à la fois avec DataObject et Clipboard.SetDataObject ; l’ajout dans plusieurs formats pour que d’autres applications puissent les reconnaître ; et le fait que la classe Clipboard n’est utilisable que depuis un thread STA, de sorte que [STAThread] est obligatoire. ↩ ↩2

  15. Microsoft Learn, Drag and Drop (COM). Sur le fait que le glisser-déposer OLE s’appuie sur les trois parties IDropSource (source de glissement), IDropTarget (cible de dépôt) et DoDragDrop (la boucle fournie par OLE) ; le fait d’offrir la même fonctionnalité que le copier-coller du presse-papiers, de sorte qu’une application qui l’implémente déjà n’a besoin que d’un petit ajout ; et les types de retour visuel. ↩ ↩2

Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.

Ces pages replacent le sujet dans un contexte plus large de services et de décisions.

Cet article est directement lié aux services suivants.

Questions fréquentes

Questions souvent posées lors d’une consultation sur le sujet de cet article.

Pourquoi la mise en forme se défait-elle lorsque je colle dans mon application un tableau copié depuis Excel ?
Parce que le presse-papiers ne détient pas « un seul morceau de données » : le même contenu est placé à la fois dans plusieurs formats (format privé de l'application, HTML Format, CSV, texte Unicode, etc.), et l'application de destination choisit le format qu'elle comprend et l'extrait. Lorsque la mise en forme se défait, la cause typique est que la destination ne lit que le texte brut (CF_UNICODETEXT). Si l'on veut aussi la structure du tableau, il faut implémenter le côté collage de sorte qu'il préfère HTML Format ou CSV. Inversement, si l'on veut que d'autres applications collent correctement depuis une copie faite dans sa propre application, on offre à la copie un format riche et un format brut en même temps.
Pourquoi ne puis-je plus coller après avoir fermé l'application depuis laquelle j'ai copié ?
Parce que la source utilise le rendu différé (delayed rendering). Les applications qui traitent de grandes données ne placent pas les données elles-mêmes à la copie ; elles n'enregistrent sur le presse-papiers qu'une promesse de « les produire sur demande ». Si la source se termine ensuite sans matérialiser les données en réponse à WM_RENDERALLFORMATS à l'arrêt, les formats non encore rendus sont perdus. Une application qui utilise le presse-papiers OLE (IDataObject) peut garder le collage possible après la sortie en appelant OleFlushClipboard à l'arrêt pour matérialiser les données.
Comment mon application peut-elle surveiller les changements du presse-papiers ?
La méthode actuellement recommandée est d'enregistrer sa fenêtre comme écouteur avec AddClipboardFormatListener et de traiter le message WM_CLIPBOARDUPDATE qui arrive à chaque changement de contenu. Interroger le contenu périodiquement avec un minuteur (polling) gaspille du travail, et l'ancienne chaîne de visionneuses basée sur SetClipboardViewer n'est conservée que pour la compatibilité ascendante, parce qu'un défaut dans une application de la chaîne casse toute la chaîne. OpenClipboard à la lecture peut aussi échouer par concurrence avec un autre processus ; une nouvelle tentative après une courte attente rend la lecture stable.
Y a-t-il un moyen de garder des secrets tels que des mots de passe hors de l'historique du presse-papiers (Win+V) ?
Il y a deux moyens, un côté application et un côté stratégie. Côté application, si l'on place aussi à la copie le format enregistré ExcludeClipboardContentFromMonitorProcessing, ce contenu n'est inclus ni dans l'historique ni dans la synchronisation inter-appareils. On peut aussi contrôler chacun séparément avec CanIncludeInClipboardHistory (historique seulement) et CanUploadToCloudClipboard (synchronisation seulement). C'est le mécanisme qu'utilisent les gestionnaires de mots de passe. Pour l'arrêter dans toute l'organisation, on peut désactiver l'historique et la synchronisation cloud eux-mêmes avec AllowClipboardHistory et AllowCrossDeviceClipboard via la Stratégie de groupe ou Intune (Policy CSP).
Pourquoi ne puis-je pas glisser-déposer un fichier sur une application qui s'exécute en tant qu'administrateur ?
Parce qu'un mécanisme de sécurité appelé UIPI (User Interface Privilege Isolation) bloque l'envoi de messages depuis un processus de plus basse intégrité vers une fenêtre de plus haute intégrité. L'Explorateur de fichiers s'exécute à privilège ordinaire (intégrité moyenne), donc les notifications de glisser-déposer n'atteignent pas la fenêtre d'une application élevée. Une solution de contournement qui autorise individuellement des messages tels que WM_DROPFILES avec ChangeWindowMessageFilterEx est connue, mais elle se limite à l'ancienne notification de dépôt. La voie de fond est de cesser de concevoir l'application pour qu'elle s'exécute élevée en permanence, et d'isoler dans un processus séparé seulement le travail qui a besoin d'élévation.

Profil de l’auteur

Page de présentation de l’auteur de l’article.

Go Komura

Représentant de KomuraSoft LLC

Spécialisé dans le développement de logiciels Windows, le conseil technique et l’analyse de pannes, notamment pour les systèmes existants et les incidents difficiles à reproduire.

Retour au blog