development

String의 내용을 C #의 클립 보드로 어떻게 복사합니까?

big-blog 2020. 4. 2. 08:15
반응형

String의 내용을 C #의 클립 보드로 어떻게 복사합니까?


문자열에 텍스트가있는 경우 사용자가 텍스트를 다른 창 (예 : 응용 프로그램에서 메모장)에 붙여 넣을 수 있도록 클립 보드에 복사하려면 어떻게해야합니까?


사용할 수 있습니다 System.Windows.Forms.Clipboard.SetText(...).


System.Windows.Forms.Clipboard.SetText(Windows Forms) 또는 System.Windows.Clipboard.SetText(WPF)


전화하기 SetText가 쉽지만, 처리해야 할 몇 가지 문제가 있습니다. 호출중인 스레드가 STA에서 실행 중인지 확인해야합니다. 때로는 액세스 거부 오류로 인해 실패 할 수 있으며 클립 보드의 COM 타이밍 문제와 관련이 있습니다. 그리고 원격 데스크톱을 통해 응용 프로그램에 액세스하는 경우 클립 보드에 대한 액세스는 개략적입니다. 우리는 SetText직접 호출하는 대신 모든 중앙 시나리오를 처리하기 위해 중앙 집중식 방법을 사용합니다 .

@Stecy : 다음은 중앙 집중식 코드입니다.

StaHelper 클래스는 클립 보드에 필요한 STA (Single Thread Apartment)의 스레드에서 임의의 코드를 실행하기 만합니다.

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

그런 다음 클립 보드에 텍스트를 설정하기위한 특정 클래스가 있습니다. DataObject일부 Windows / .NET 버전의 일부 경우에는 수동으로 작성 해야합니다. 지금 정확한 시나리오를 기억하지 못하고 .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 );
    }
}

사용법은 다음과 같습니다.

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

WPF : System.Windows.Clipboard(PresentationCore.dll)

Winforms : System.Windows.Forms.Clipboard

둘 다 정적 SetText방법이 있습니다.


이것은 나를 위해 작동합니다 :

당신이하고 싶은 :

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

그러나 ApartmentState.STA의 단일 스레드에 있어야한다는 오류가 발생합니다.

그런 스레드에서 실행되도록합시다. 그것을위한 코드 :

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

을 호출 copy_to_clipboard()하면 문자열이 클립 보드에 복사되므로 붙여 넣기 또는 Ctrl+ V를 사용하여 문자열을 문자열로 되돌려 클립 보드에 복사 할 수 있습니다 .


이 질문에 표시된 솔루션을 사용하면 System.Windows.Forms.Clipboard.SetText(...)예외가 발생합니다.

OLE 호출을 수행하기 전에 현재 스레드를 단일 스레드 아파트 (STA) 모드로 설정해야합니다.

이를 방지하기 위해 다음 속성을 추가 할 수 있습니다.

[STAThread]

static void Main(string[] args)

Windows Forms에서 문자열이 텍스트 상자에 있으면 다음을 쉽게 사용할 수 있습니다.

textBoxcsharp.SelectAll();
textBoxcsharp.Copy();
textBoxcsharp.DeselectAll();

오류가 있더라도 try-를 사용 catch하면 여전히 복사됩니다.

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

End Try

메시지 상자를 사용하여 예외를 캡처하면 오류가 표시되지만 값은 여전히 ​​클립 보드에 복사됩니다.

참고 URL : https://stackoverflow.com/questions/899350/how-do-i-copy-the-contents-of-a-string-to-the-clipboard-in-c

반응형