sourcecode

문자열의 내용을 C#의 클립보드에 복사하려면 어떻게 해야 합니까?

codebag 2023. 6. 12. 21:21
반응형

문자열의 내용을 C#의 클립보드에 복사하려면 어떻게 해야 합니까?

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

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

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

전화하고 싶습니다SetText그렇게 쉬웠지만 당신이 처리해야 할 고트카가 꽤 있습니다.호출할 스레드가 STA에서 실행되고 있는지 확인해야 합니다.때때로 액세스 거부 오류와 함께 실패하고 몇 초 후에 문제 없이 작동할 수 있습니다. 클립보드의 COM 타이밍 문제와 관련이 있습니다.또한 원격 데스크톱을 통해 응용 프로그램에 액세스하는 경우 클립보드에 대한 액세스가 스케치됩니다.전화를 거는 대신 중앙 집중식 방법을 사용하여 이 모든 시나리오를 처리합니다.SetText직접적으로.

@스테시: 다음은 중앙 집중식 코드입니다.

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에서는 Edge의 경우 수동으로 작업해야 합니다.지금은 정확한 시나리오가 기억나지 않으며 에서 필요하지 않을 수도 있습니다.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(프레젠테이션 Core.dll)

윈폼:System.Windows.Forms.Clipboard

둘 다 정전기가 발생합니다.SetText방법.

이것은 나에게 도움이 됩니다.

원하는 작업:

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

그러나 아파트 상태의 단일 스레드에 있어야 한다는 오류가 발생합니다.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()문자열이 클립보드에 복사되므로 붙여넣기 또는 +를 사용하고 문자열을 다시 클립보드에 복사할 문자열로 가져올 수 있습니다.

이 질문에 나타난 솔루션을 사용하여,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

반응형