【问题标题】:How to convert IntPtr to InteropService.SafeHandle?如何将 IntPtr 转换为 InteropService.SafeHandle?
【发布时间】:2016-12-07 05:21:15
【问题描述】:

从这里提供的答案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'

有办法解决吗?

【问题讨论】:

  • 该代码只能在 Winforms 项目中运行。无论如何,您都不想使用它,它有一个令人讨厌的句柄泄漏,会在一段时间后使您的程序崩溃。

标签: c# .net wpf


【解决方案1】:

这里的基本问题是,当您实际使用 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 构造函数,而是通过互操作使用其他本机函数来检索光标数据,将其写入数组,然后将数组包装在 @987654332 中@ 你可以传递给 WPF Cursor 构造函数。或者,
  2. 使用 WPF 特定解决方案之一从现有图像数据创建Cursor 对象。例如,Custom cursor in WPF?(我特别喜欢this answer……那里有几个不错的,尽管它们都涉及在某些时候通过System.Drawing 命名空间使用GDI+)或Rotating Cursor According to Rotated TextBox(再次使用GDI+)。

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 2013-08-12
    • 2010-09-07
    • 1970-01-01
    • 2010-10-20
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多