c# - transferencia - recuperar texto copiado anteriormente




Como faço para copiar o conteúdo de uma String para a área de transferência em c#? (6)

Eu gostaria que chamar o SetText fosse assim tão fácil, mas existem algumas dicas com as quais você tem que lidar. Você tem que certificar-se de que o segmento que você está chamando está em execução no STA. Por vezes, pode falhar com um erro de acesso negado e, em seguida, trabalhar segundos depois sem problemas - algo a ver com os problemas de temporização de COM na área de transferência. E se o seu aplicativo for acessado por meio do acesso à Área de Trabalho Remota, a área de transferência ficará incompleta. Usamos um método centralizado para lidar com todos esses cenários em vez de chamar SetText diretamente.

@Stecy: Aqui está o nosso código centralizado:

A classe StaHelper simplesmente executa algum código arbitrário em um thread no Single Thread Apartment (STA) - exigido pela área de transferência.

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();
}

Então nós temos uma classe específica para definir o texto na área de transferência. Criar um DataObject manualmente é necessário em alguns casos de borda em algumas versões do Windows / .NET. Não me lembro dos cenários exatos agora e talvez não seja necessário no .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 );
    }
}

Uso parece com isso:

new SetClipboardHelper( DataFormats.Text, "See, I'm on the clipboard" ).Go();

Se eu tiver algum texto em uma String, como posso copiá-lo para a área de transferência para que o usuário possa colá-lo em outra janela (por exemplo, do meu aplicativo para o Bloco de Notas)?


Isso funciona para mim:

Você quer fazer:

System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard");

Mas provoca um erro dizendo que deve estar em um único segmento de ApartmentState.STA.

Então, vamos fazê-lo correr em tal segmento. O código para isso:

public void somethingToRunInThread()
{
    System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard");
}

protected void copy_to_clipboard()
{
    Thread clipboardThread = new Thread(somethingToRunInThread);
    clipboardThread.SetApartmentState(ApartmentState.STA);
    clipboardThread.IsBackground = false;
    clipboardThread.Start();
}

Depois de chamar copy_to_clipboard() , a string é copiada para a área de transferência, então você pode colar ou Ctrl + V e voltar a string como String para ser copiado para a área de transferência .


Usando a solução mostrada nesta pergunta, System.Windows.Forms.Clipboard.SetText(...) , resulta na exceção:

O encadeamento atual deve ser configurado para o modo de encadeamento único (STA) antes que as chamadas OLE possam ser feitas

Para evitar isso, você pode adicionar o atributo:

[STAThread]

para

static void Main(string[] args)

Use o try - catch , mesmo que tenha um erro que ele ainda copiará.

Try
   Clipboard.SetText("copy me to clipboard")
Catch ex As Exception

End Try

Se você usar uma caixa de mensagem para capturar a exceção, ela mostrará erro, mas o valor ainda será copiado para a área de transferência.



Você pode usar System.Windows.Forms.Clipboard.SetText(...) .





clipboard