C# 将笔转换为IntPtr

C# 将笔转换为IntPtr,c#,gdi+,pointers,C#,Gdi+,Pointers,有没有一种简单的方法可以将System.Drawing.Pen转换为其非托管对应项?比如,如果你有一支这样的钢笔: Pen p = new Pen(Color.Blue, 1f); IntPtr ptr = p.ToPtr(); 我知道这个代码不起作用,但是有没有类似的方法?这个Pen类有一个内部属性NativePen,它正好包含您想要的内容。您可以通过反射访问此属性(如果您的代码具有相应的权限),方法是: 请注意,从理论上讲,这在.NET Framework的未来版本中可能不起作用,因为内部

有没有一种简单的方法可以将System.Drawing.Pen转换为其非托管对应项?比如,如果你有一支这样的钢笔:

Pen p = new Pen(Color.Blue, 1f);
IntPtr ptr = p.ToPtr();

我知道这个代码不起作用,但是有没有类似的方法?

这个
Pen
类有一个内部属性
NativePen
,它正好包含您想要的内容。您可以通过反射访问此属性(如果您的代码具有相应的权限),方法是:


请注意,从理论上讲,这在.NET Framework的未来版本中可能不起作用,因为内部属性可能会更改…

您对
HPEN
GDI句柄感兴趣吗?还请注意,这在其他.NET实现(尤其是Mono)中不起作用。好吧,我没有它就解决了我的问题,但这可能会解决我的问题,所以我会标记它。无论如何谢谢你@康拉德:对。但我不确定在mono中将笔转换成IntPtr是否有意义。毕竟,转换意味着访问底层的图形系统,如果您使用的是mono,那么这些图形系统可能会有很大的变化。我的评论实际上就是这个意思,而不是批评。你的答案仍然很有趣(我以前以为我投了更高的票)。
Pen p = new Pen(Color.Blue, 1f);
PropertyInfo pi = typeof(Pen).GetProperty("NativePen", BindingFlags.Instance | BindingFlags.NonPublic);
IntPtr ip = (IntPtr)pi.GetValue(p, null);