2009-05-28 2 views

Répondre

3

La manière la plus simple de préserver le contenu du presse-papiers consiste à laisser le presse-papiers seul. Le presse-papiers est conçu comme une zone de stockage temporaire pour l'utilisateur, pas pour les applications, donc il est probable que ce que vous essayez de faire ait de meilleures solutions que d'écraser le presse-papier.

+3

Nous vous remercions de votre suggestion, mais cela ne répond pas à ma question. –

+0

Eh bien, ce serait bien si vous incluez la raison pour laquelle vous voulez faire cela dans votre question. Ensuite, il est plus facile de concevoir une solution qui fait ce que vous voulez. Je considère toujours que le blocage temporaire du presse-papiers est une idée très stupide. – Joey

+3

Il n'y a aucune raison valable de le faire. "Les programmes ne doivent pas transférer des données dans notre presse-papiers sans une instruction explicite de l'utilisateur." - Charles Petzold, Programmation Windows 3.1, Microsoft Press, 1992 –

0

Vous pouvez utiliser OpenClipboard et CloseClipboard. Selon MSDN l'ouverture du presse-papiers empêchera les autres applications de modifier les données.

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern bool OpenClipboard(IntPtr hWndNewOwner); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern bool CloseClipboard(); 
+1

Merci pour votre réponse, mais ce que je veux, c'est pouvoir stocker le contenu du presse-papiers, utiliser le presse-papiers pour un copier/coller, puis restaurer le contenu d'origine. –

+0

Maintenir le presse-papiers ouvert CRASH d'autres applications quand ils essaient d'ouvrir le clipboad, ne peut pas, et ne pas le gérer correctement. –

0

De quelle manière votre code ci-dessus ne fonctionne pas? Lorsque j'essaie le code équivalent en C#, j'obtiens une exception "CloseClipboard Failed (exception de HRESULT: 0x800401D4 (CLIPBRD_E_CANT_CLOSE))" lors de l'appel de Clipboard.SetDataObject (iData).

Cependant, la solution suivante fait le travail pour moi:

// save 
Dictionary<String, Object> d = new Dictionary<String, Object>(); 
IDataObject ido = Clipboard.GetDataObject(); 
foreach (String s in ido.GetFormats(false)) 
    d.Add(s, ido.GetData(s)); 

// ... 

// restore 
var da = new DataObject(); 
foreach (String s in d.Keys) 
    da.SetData(s, d[s]); 
Clipboard.SetDataObject(da); 
+0

Thak vous pour la réponse, je l'ai essayé et cela fonctionne pour le texte brut. Malheureusement, il se produit une erreur lorsque le texte dans le presse-papiers provient de MS Word. –

0

Je suis d'accord que le contexte est important. Dans mon cas, je voulais coller un document de page de couverture formaté, rempli dynamiquement, sur le devant de certains textes générés dynamiquement (tous dans MS Word). Voici la solution que je trouve (en utilisant VSTO et C#):

   object start = 0; 
       Word.Range startRng = a_TreatedDocument.Range(ref start, ref start); 
       startRng.FormattedText = a_CoverPageDocument.Content.FormattedText; 

Remarque, cela fonctionne avec des tables et du texte formaté.