2012-07-26 3 views
2

장치 독립적 비트 맵을 클립 보드에서 가져 오려고합니다. .NET Framework에서 Clipboard.GetData inbuilt를 통해이 작업을 수행 할 수 있음을 잘 알고 있지만 웹 사이트의 여러 곳에서 문서화 된 것처럼 버그가 많기 때문에 API 만 사용하려고합니다.포인터를 MemoryStream으로 변환 하시겠습니까?

나는 다음과 같은 코드를 작성했다.

//i can correctly cast this to a MemoryStream 
MemoryStream ms = Clipboard.GetData("DeviceIndependentBitmap") as MemoryStream; 

하지만 API를 사용하여 스트림을 가리키는 포인터 (IntPtr)를 반환하는 방법을 사용하고 싶습니다. UnmanagedMemoryStream을 살펴 보았지만 정확히 IntPtr으로 변환하는 방법을 이해하지 못했습니다.

다음은 내 API 코드입니다 (형식을 인수로 사용하는 GetClipboardData API 사용).

IntPtr p = GetClipboardData(8); 
//what do I do from here to get a MemoryStream from this pointer? 

나는 약간 혼란 스럽다. 나는 이미 그것을 직접 연구했지만 유용한 것을 만들 수 없었다.

답변

6

당신이 말한대로 UnmanagedMemoryStream(byte* pointer, long length)을 사용할 수 있으며 그것을 사용하려면 포인터와 바이트의 길이가 있어야합니다. 따라서 IntPtr.ToPointer() 메서드를 사용하여 포인터를 가져올 수 있지만 메모리 내용의 길이를 알아야합니다.

UnmanagedMemoryStream unmanagedmemstream = UnmanagedMemoryStream(p.ToPointer(), 100); 

가 바이트의 배열을 검색하는 또 다른 방법뿐만 아니라 여기에 당신은 당신이 원하는 메모리 바이트 아이폰에 알고 있어야하며 Marshal.Copy(IntPtr source, byte[] destination, int startIndex,int length)입니다 :

byte[] buffer = new byte[100]; 
Marshal.Copy(p , buffer, 0, buffer.Lenght); 
관련 문제