2017-09-13 12 views
2

원격 컴퓨터에서 로컬 컴퓨터로 복사하여 붙여 넣을 수 있어야하는 프로그램이 있습니다. 내가 상관없이 내가 복사하려고 얼마나 많은 요소 0 요소로 컬렉션을 반환하지Clipboard.GetFileDropList()가 원격 데스크톱에서 빈 컬렉션을 반환하는 이유는 무엇입니까?

Clipboard.GetDropList(); 

를 사용할 때

내 문제이다.

나는 그것을 시도 :

if (Clipboard.ContainsFileDropList()) 
{ 
    foreach (string item in Clipboard.GetFileDropList()) 
    { 
     File.Copy(item, path + '\\' + Path.GetFileName(item)); 
    } 
} 

가 나는 또한 (BoltBait's answer를) 시도 :

System.Collections.Specialized.StringCollection idat = null; 
Exception threadEx = null; 
Thread staThread = new Thread(
    delegate() 
    { 
     try 
     { 
      idat = Clipboard.GetFileDropList(); 
     } 
     catch (Exception ex) 
     { 
      threadEx = ex; 
     } 
    }); 
staThread.SetApartmentState(ApartmentState.STA); 
staThread.Start(); 
staThread.Join(); 

두 버전 모두 빈 컬렉션을 반환합니다.

어디에서 문제가 발생할 수 있습니까? 그 알고 :

  • 복사/붙여 넣기를 원격에서 로컬로 (창을 통해하는) 활성화 작업 (코드를 통해) 지역
  • 클립 보드 공유로 현지에서
  • 복사/붙여 넣기를 작동
  • OS (로컬) : 윈도우 10
  • OS (원격) : 윈도우 서버 2008 R2

답변

0

당신은 빈 컬렉션 클립 보드에 데이터를 포함하지 않는다는 사실입니다받을 이유는 내가 n DataFormats.FileDrop 형식.

대신 원격 데스크톱을 통해 원격 컴퓨터의 일부 파일을 복사 할 때 (클립 보드 공유가 활성화 된 상태에서) 파일 내용이 클립 보드에 직접 저장됩니다. 클립 보드는 다음과 같은 형식의 데이터가 포함됩니다

  • FILEGROUPDESCRIPTOR이 - 그래서 이론적으로 (실제로, FILEGROUPDESCRIPTORA 또는 FILEGROUPDESCRIPTORW, 시스템에서 두 번째)
  • CFSTR_FILECONTENTS
  • CFSTR_PREFERREDDROPEFFECT

당신이 할 수 FILEGROUPDESCRIPTOR 오브젝트를 반복하고 각 파일을 클립 보드에서 CFSTR_FILECONTENTS으로 저장하십시오.

그러나 이것은 Windows Forms의 첫 번째 파일에서만 작동한다고 설명하는 bug report을 발견했습니다. 따라서 네이티브 메소드를 호출하여 P/Invoke를 사용하여 구현해야합니다.

+0

FileContents에 액세스하려고하면 예외가 발생합니다 (CLIPBRD_E_BAD_DATA HRESULT : 0x800401D3). GetData ("FileContents")를 사용하고 있습니다.). 내가 사용해야하는 또 다른 방법이 있습니까? – user3399

+0

불행하게도, 이것은 .NET에서'Clipboard' 구현에 의해 잘 지원되지 않습니다. P/Invoke를 통해 또는 자체 관리되지 않는 모듈을 만들어 관리되지 않는 접근 방식으로 전환해야합니다. 자세한 내용은 [이 항목] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb776904%28v=vs.85%29.aspx#filecontents)을 참조하십시오. – dymanoid