转换一个指针到MemoryStream?(Converting a pointer into a M

2019-09-20 05:11发布

我试图获取从剪贴板独立设备的位图 。 我充分意识到,这可以通过在.NET Framework的Clipboard.GetData功能内置来完成,但因为它是非常错误(如记录在网络上的许多地方),我只想使用的API。

我写了下面的代码工作。

//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?

我有点困惑。 我已经研究过它自己,但不能拿出一些有用的东西。

Answer 1:

至于你说的,你可以使用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);


文章来源: Converting a pointer into a MemoryStream?
标签: c# wpf clipboard