2012-07-26 33 views
2

我正试图从剪贴板中取设备无关位图。我很清楚,这可以通过内嵌在.NET Framework中的Clipboard.GetData函数完成,但由于它非常麻烦(如网上许多地方所记录),我只想使用这些API。将指针转换成MemoryStream?

我写了下面的代码,它的作品。

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

但我想用它与API,它只是返回一个指向流的指针(IntPtr)。我查看了UnmanagedMemoryStream,但未能理解如何将IntPtr正确转换为该格式。

这是我的API代码(使用GetClipboardData API,其中CF_DIB格式设置为其参数)。

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

有检索字节数组另一种方法,而且在这里你应该知道,你想要的内存字节lenght,这是Marshal.Copy(IntPtr source, byte[] destination, int startIndex,int length)

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