Je ferai de mon mieux pour expliquer en détail ce que j'essaie d'accomplir.Comment sauvegarder et restaurer le presse-papiers du système en C#?
J'utilise C# avec des poignées de fenêtre IntPtr pour effectuer une opération de copie CTRL-C sur une application externe à partir de ma propre application C#. Je devais le faire parce qu'il n'y avait aucun moyen d'accéder directement au texte en utilisant GET_TEXT. J'utilise alors le contenu textuel de cette copie dans mon application. Le problème ici est que j'ai maintenant écrasé le presse-papiers.
Ce que je voudrais être en mesure de faire est:
- sauvegarde le contenu du presse-papiers d'origine qui aurait pu être fixé par une application autre que moi-même.
- Puis effectuez la copie et stockez la valeur dans mon application.
- Ensuite, restaurez le contenu d'origine du presse-papiers afin que l'utilisateur ait toujours accès à ses données de presse-papiers d'origine.
C'est le code que je l'ai essayé jusqu'à présent:
private void GetClipboardText()
{
text = "";
IDataObject backupClipboad = Clipboard.GetDataObject();
KeyboardInput input = new KeyboardInput(this);
input.Copy(dialogHandle); // Performs a CTRL-C (copy) operation
IDataObject clipboard = Clipboard.GetDataObject();
if (clipboard.GetDataPresent(DataFormats.Text))
{
// Retrieves the text from the clipboard
text = clipboard.GetData(DataFormats.Text) as string;
}
if (backupClipboad != null)
{
Clipboard.SetDataObject(backupClipboad, true); // throws exception
}
}
J'utilise le System.Windows.Clipboard et non la System.Windows.Forms.Clipboard. La raison de ceci était que quand j'ai exécuté le CTRL-C, la classe de Presse-papiers de System.Windows.Forms n'a renvoyé aucune donnée, mais le presse-papiers du système l'a fait. J'ai examiné quelques-uns des appels de bas niveau user32 comme OpenClipboard, EmptyClipboard et CloseClipboard en espérant qu'ils aideraient à faire cela, mais jusqu'à présent je continue à obtenir des exceptions COM en essayant de restaurer.
Je pensais que peut-être cela avait à voir avec le paramètre OpenClipboard qui attend un handle de fenêtre IntPtr de l'application qui veut prendre le contrôle du presse-papiers. Depuis que j'ai mentionné que mon application n'a pas de GUI c'est un défi. Je n'étais pas sûr de ce qu'il fallait passer ici. Peut-être que quelqu'un peut faire la lumière sur cela? Est-ce que j'utilise incorrectement la classe Presse-papiers? Existe-t-il un moyen clair d'obtenir le handle de fenêtre IntPtr d'une application sans interface graphique? Est-ce que quelqu'un sait d'une meilleure façon de sauvegarder et de restaurer le presse-papiers du système?
J'ai rencontré la même erreur et trouvé ce post. Cependant, j'ai cette erreur seulement si j'appelle Clipboard.GetDataObject(). SetData (myData). Cela fonctionne très bien si j'appelle Clipboard.SetDataObject (myData). Toute explication pourquoi? Mon application est basée sur WPF si c'est important. – newman