C #에서 클립 보드에 데이터를 복사하는 방법


답변:


799

다른 어셈블리와 다른 네임 스페이스에있는 두 개의 클래스가 있습니다.

  • WinForms : 다음 네임 스페이스 선언을 사용 Main하고 [STAThread]속성 으로 표시되어 있는지 확인하십시오 .

    using System.Windows.Forms;
  • WPF : 다음 네임 스페이스 선언 사용

    using System.Windows;
  • 콘솔 :에 참조를 추가하고 System.Windows.Forms다음 네임 스페이스 선언을 사용 Main하고 [STAThread]속성 으로 표시되어 있는지 확인하십시오 . 다른 답변의 단계별 가이드

    using System.Windows.Forms;

정확한 문자열을 복사하려면 (이 경우 리터럴) :

Clipboard.SetText("Hello, clipboard");

텍스트 상자의 내용을 복사하려면 TextBox.Copy ()를 사용 하거나 먼저 텍스트를 가져온 다음 클립 보드 값을 설정하십시오.

Clipboard.SetText(txtClipboard.Text);

예를 보려면 여기를 참조하십시오 . 또는 ... 공식 MSDN 문서 또는 여기 WPF .


비고 :


@KierenJohnstone 키-값 쌍을 사용하여 클립 보드 내용에 액세스 할 수 있습니까?
Abdul

@ Abdul-무슨 말인지 잘 모르겠습니다. 클립 보드 내용은 텍스트, 파일, 이미지, 모든 종류의 사용자 정의 데이터가 될 수 있습니다. kv 쌍의 개념은 클립 보드 아이디어와 관련이없는 것 같습니다.
Kieren Johnstone

@KierenJohnstone 내가하려는 것은 사용자가 클립 보드에 여러 가지를 저장할 수있는 것입니다. 그런 것들은 열쇠로 접근 할 수 있습니다. HTML5 로컬 저장소와 비슷합니다. 아니면 클립 보드의 특성으로 인해 불가능한 것입니까?
Abdul

ASP.NET에 오류가 발생하면 새 스레드로 사용해보십시오. var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692

1
skia.heliou의 답변이 도움이되었습니다. [STAThreadAttribute] 속성을 추가 한 후 Clipboard.SetText 메서드가 작동하기 시작했습니다.
viteo

44

들어 콘솔 단계별 방식으로 프로젝트를 먼저 추가해야 System.Windows.Forms참조. 다음 단계는 Visual Studio Community 2013 with .NET 4.5에서 작동합니다.

  1. 에서 솔루션 탐색기 , 콘솔 프로젝트를 확장합니다.
  2. 참조를 마우스 오른쪽 단추로 클릭 한 후 참조 추가 ... 를 클릭 하십시오.
  3. 에서 어셈블리 그룹에서 프레임 워크 를 선택합니다 System.Windows.Forms.
  4. 확인을 클릭하십시오 .

그런 다음 using코드 맨 위에 다른 명령문과 함께 다음 명령문을 추가하십시오 .

using System.Windows.Forms;

그런 다음 다음 중 하나를 추가하십시오 Clipboard. SetText코드에 대한 진술 :

Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);

마지막 으로 다음과 같이 메소드에 추가 STAThreadAttribute하여 :MainSystem.Threading.ThreadStateException

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}

1
이 클래스는 StackOverflowException즉시 선행 STAThreadAttribute는 .NET Framework 시스템 클래스 라이브러리는 =)
skia.heliou

42

클립 보드에 WPF C # 대처를 사용 하여이 문제에 대한 나의 경험 System.Threading.ThreadStateException은 모든 브라우저에서 올바르게 작동하는 코드와 함께 있습니다.

Thread thread = new Thread(() => Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start(); 
thread.Join();

이 게시물에 대한 크레딧 여기

그러나 이것은 localhost에서만 작동하므로 서버에서는 작동하지 않으므로 시도하지 마십시오.

서버 측에서는을 사용하여 수행했습니다 zeroclipboard. 많은 연구 끝에 유일한 방법.


자동화 된 Selenium 테스트 (웹 드라이버)에서 사용했으며 훌륭하게 작동합니다!
andrew.fox

@ andrew.fox 서버-클라이언트 모델에서 사용해 보셨습니까? 그것이 두 개의 별도의 기계라면 작동하지 않아야한다고 생각하기 때문입니다.
BMaximus

아니요, Selenium은 에이전트 시스템에서 브라우저 창을 엽니 다.
andrew.fox

41
Clipboard.SetText("hello");

이를 위해 System.Windows.Forms또는 System.Windows네임 스페이스 를 사용해야합니다 .


1

Clip.exe는 Windows에서 클립 보드를 설정하기위한 실행 파일입니다. 참고 이 작동하지 않는 다른 운영 체제 여전히 짜증 윈도우 이외.

        /// <summary>
        /// Sets clipboard to value.
        /// </summary>
        /// <param name="value">String to set the clipboard to.</param>
        public static void SetClipboard(string value)
        {
            if (value == null)
                throw new ArgumentNullException("Attempt to set clipboard with null");

            Process clipboardExecutable = new Process(); 
            clipboardExecutable.StartInfo = new ProcessStartInfo // Creates the process
            {
                RedirectStandardInput = true,
                FileName = @"clip", 
            };
            clipboardExecutable.Start();

            clipboardExecutable.StandardInput.Write(value); // CLIP uses STDIN as input.
            // When we are done writing all the string, close it so clip doesn't wait and get stuck
            clipboardExecutable.StandardInput.Close(); 

            return;
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.