如何将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"
有办法解决吗?
这里的基本问题是,当您实际使用WPF API时,您试图使用Winforms API的代码示例。该代码中使用的Cursor
类是System.Windows.Forms.Cursor
,而您使用的类实际上是System.Windows.Input.Cursor
。它们完全不同,包括具有完全不同的构造函数。
Winforms版本将接受一个IntPtr
值,表示对本机Windows游标对象的句柄。但是WPF类只接受一些现有的.cur或.ani数据,可以通过Stream
(数据本身)或string
实例(文件名…这可以是pack:
方案路径,因此如果您愿意,可以使用嵌入式资源)。
如果您想在WPF中从动态图像创建光标,您可以:
- 使用Winforms示例,但不要尝试将光标句柄传递给
Cursor
构造函数,而是通过interop使用其他本机函数来检索光标数据,将其写入数组,然后将数组封装在MemoryStream
中,以便传递给WPFCursor
构造函数。或者 - 使用WPF特定的解决方案之一从现有图像数据创建
Cursor
对象。例如,WPF中的自定义光标?(我特别喜欢这个答案…有几个不错的答案,尽管它们都涉及到在某个时候通过System.Drawing
命名空间使用GDI+),或者根据旋转的文本框旋转光标(再次使用GDI+)