c# - 将指针转换为 MemoryStream?

标签 c# wpf clipboard

我正在尝试从剪贴板中获取设备独立位图。我很清楚这可以通过 .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?

我有点困惑。我已经自己研究过了,但找不到有用的东西。

最佳答案

正如您所说,您可以使用 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.Length);

关于c# - 将指针转换为 MemoryStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11660643/

相关文章:

c# - 带有动态对象的 MongoDB C# 驱动程序序列化

c# - 带有MVVM的Datagrid中的wpf级联组合框

c# - WPF:在代码隐藏中获取控件绑定(bind)到的属性

excel - 使用 Outlook VBA 将电子邮件复制到剪贴板

linux - 是否可以在Ubuntu中的剪贴板中存储多个对象?

java - 如何使用java将日语编码文本(Unicode类型除外)复制到剪贴板?

c# - 如何使用反射获取 Task<T> 中 T 类型的属性?

c# - 从嵌入式资源更改 Gtk.Button 图像

c# - switch语句C#的测试用例

c# - 动态修改DataGrid列