Si j’ai un texte dans une chaîne, comment puis-je copier que dans le presse-papiers afin que l’utilisateur peut coller dans une autre fenêtre (par exemple de ma demande au bloc-notes) ?
- Comment copier des données dans le presse-papiers en C# (5 réponses )
Réponses
Trop de publicités?Je souhaite appeler SetText été facile, mais il ya quelques pièges que vous avez à traiter avec. Vous devez assurez-vous que le fil que vous êtes en l'appelant sur est en cours d'exécution dans le STA. Il peut parfois échouer avec une erreur d'accès refusé ensuite de travailler secondes plus tard sans problème - chose à voir avec la COM les problèmes de synchronisation dans le presse-papiers. Et si votre application est accessible via le Bureau à Distance dans le presse-papiers est louche. Nous utilisons une méthode centralisée pour gérer tous ces scénarios au lieu de l'appeler SetText directement.
@Stecy: Voici notre centralisée code:
Le StaHelper classe exécute simplement un code arbitraire sur un fil dans le Thread Unique Appartement (STA) - exigée par le presse-papiers.
abstract class StaHelper
{
readonly ManualResetEvent _complete = new ManualResetEvent( false );
public void Go()
{
var thread = new Thread( new ThreadStart( DoWork ) )
{
IsBackground = true,
}
thread.SetApartmentState( ApartmentState.STA );
thread.Start();
}
// Thread entry method
private void DoWork()
{
try
{
_complete.Reset();
Work();
}
catch( Exception ex )
{
if( DontRetryWorkOnFailed )
throw;
else
{
try
{
Thread.Sleep( 1000 );
Work();
}
catch
{
// ex from first exception
LogAndShowMessage( ex );
}
}
}
finally
{
_complete.Set();
}
}
public bool DontRetryWorkOnFailed{ get; set; }
// Implemented in base class to do actual work.
protected abstract void Work();
}
Ensuite, nous avons une classe spécifique de la mise en texte sur le presse-papiers. La création d'un DataObject
manuelle est nécessaire dans certains cas limites sur certaines versions de Windows/.NET. Je ne me souviens pas exactement des scénarios de maintenant et il peut ne pas être nécessaire dans .NET 3.5.
class SetClipboardHelper : StaHelper
{
readonly string _format;
readonly object _data;
public SetClipboardHelper( string format, object data )
{
_format = format;
_data = data;
}
protected override void Work()
{
var obj = new System.Windows.Forms.DataObject(
_format,
_data
);
Clipboard.SetDataObject( obj, true );
}
}
L'utilisation ressemble à ceci:
new SetClipboardHelper( DataFormats.Text, "See, I'm on the clipboard" ).Go();
Cela fonctionne pour moi :
Vous voulez faire : System.Windows.Forms.Clipboard.SetText ("chaîne à être copié dans le presse-papiers") ;
Mais elle provoque une erreur disant qu'il doit être dans un seul thread d’ApartmentState.STA.
Permet donc de faire fonctionner dans un tel fil, le code correspondant :
Après avoir appelé copy_to_clipboard(), la chaîne est copié dans le presse-papiers afin que vous pouvez coller ou Ctrl-V et récupérer la chaîne comme « Chaîne à être copié dans le presse-papiers ».