如何将IntPtr转换为InteropService.SafeHandle?

时间:2016-08-02 01:36:31

标签: c# .net wpf

从这里提供的答案Can I choose a custom image for C# Windows Application Drag Drop functions?,为什么以下行:

return new Cursor(CreateIconIndirect(ref tmp));

导致编译器发出此错误:

  

最佳重载方法匹配' System.Windows.Input.Cursor.Cursor(string)'有一些无效的论点       参数1:无法转换为System.IntPtr'到' System.Runtime.InteropService.SafeHandle'

并且有办法解决它吗?

1 个答案:

答案 0 :(得分:1)

这里的基本问题是,当您实际使用WPF API时,您正尝试使用适用于Winforms API的代码示例。该代码中使用的Cursor类为System.Windows.Forms.Cursor,而您正在使用的类实际上是System.Windows.Input.Cursor。它们完全不同,包括完全不同的构造函数。

Winforms版本将接受IntPtr值,表示本机Windows游标对象的句柄。但是WPF类只接受一些现有的.cur或.ani数据,可以通过Stream(数据本身)或string实例(文件名...这可以是{{1方案路径,如果你愿意,你可以使用嵌入式资源。

如果要在WPF中动态创建图像中的光标,可以:

  1. 使用Winforms示例,但不是尝试将游标句柄传递给pack:构造函数,而是通过interop使用其他本机函数来检索游标数据,将其写入数组,然后将数组包装在您可以传递给WPF Cursor构造函数的MemoryStream。或者,
  2. 使用其中一个特定于WPF的解决方案从现有图像数据创建Cursor对象。例如,Custom cursor in WPF?(我特别喜欢this answer ...那里有几个好的,尽管它们都涉及在Cursor命名空间处使用GDI +),或Rotating Cursor According to Rotated TextBox (再次,使用GDI +)。