如何将IntPtr转换为Cursor或SafeHandle?

时间:2013-04-16 23:23:01

标签: c# wpf cursor handle

我在.NET 3.5中,我找到了

CursorInteropHelper.Create()

方法here。但是,如何将IntPtr for cursor转换为SafeHandle是绝对不清楚的。列出的here SafeHandle的实现列表不包括SafeCursorHandle,其他的是抽象的或不相关的。唯一的方法是创建我自己的SafeHandle实现吗?

2 个答案:

答案 0 :(得分:3)

SafeHandle是一个抽象类。它希望您提供可以释放句柄的具体SafeHandle派生类的对象。不幸的是,你忘了提到你是如何获得IntPtr的,所以我们不知道它应该如何发布。

我会猜测并假设它是一个GDI游标,你从CreateCursor()winapi函数得到的游标。这需要调用DestroyCursor()来释放句柄。这样的课程看起来像这样:

class SafeCursorHandle : Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid {
    public SafeCursorHandle(IntPtr handle) : base(true) {
        base.SetHandle(handle);
    }
    protected override bool ReleaseHandle() {
        if (!this.IsInvalid) {
            if (!DestroyCursor(this.handle))
                throw new System.ComponentModel.Win32Exception();
            this.handle = IntPtr.Zero;
        }
        return true;
    }
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    private static extern bool DestroyCursor(IntPtr handle);
}

根据需要调整ReleaseHandle()覆盖以释放你手柄中的句柄。

答案 1 :(得分:0)

根据MSDN文档,ReleaseHandle()必须永远不会失败: http://msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.releasehandle%28v=vs.110%29.aspx "因为SafeHandle的一个功能是保证防止资源泄漏,所以ReleaseHandle实现中的代码绝不能失败。"

IMO,这意味着它不能抛出 - 就像本机析构函数一样。