如何将IntPtr转换为InteropService.SafeHandle

本文关键字:InteropService SafeHandle 转换 IntPtr | 更新日期: 2023-09-27 17:59:42

根据这里提供的答案,我可以为C#Windows应用程序拖放函数选择一个自定义图像吗?,为什么下面的行:

return new Cursor(CreateIconIndirect(ref tmp));

导致编译器发出以下错误:

与"System.Windows.Input.Cursor.Cursor(string)"匹配的最佳重载方法包含一些无效参数参数1:无法从"System.IntPtr"转换为"System.Runtime.InteropService.SafeHandle"

有办法解决吗?

如何将IntPtr转换为InteropService.SafeHandle

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

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

如果您想在WPF中从动态图像创建光标,您可以:

  1. 使用Winforms示例,但不要尝试将光标句柄传递给Cursor构造函数,而是通过interop使用其他本机函数来检索光标数据,将其写入数组,然后将数组封装在MemoryStream中,以便传递给WPF Cursor构造函数。或者
  2. 使用WPF特定的解决方案之一从现有图像数据创建Cursor对象。例如,WPF中的自定义光标?(我特别喜欢这个答案…有几个不错的答案,尽管它们都涉及到在某个时候通过System.Drawing命名空间使用GDI+),或者根据旋转的文本框旋转光标(再次使用GDI+)