1

私は .NET 3.5 を使用しています。

CursorInteropHelper.Create()

方法はこちら。ただし、カーソルの IntPtr を SafeHandle に変換する方法はまったく不明です。ここにリストされている SafeHandle の実装のリストには SafeCursorHandleが含まれておらず、その他は抽象的または無関係です。唯一の方法は、SafeHandle の独自の実装を作成することですか?

4

2 に答える 2

3

SafeHandle は抽象クラスです。ハンドルを解放できる具体的な SafeHandle 派生クラスのオブジェクトを提供する必要があります。残念ながら、その IntPtr をどのように取得したかを言及するのを忘れていたため、どのように解放する必要があるかわかりません。

CreateCursor() winapi 関数から取得した GDI カーソルであると推測します。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() オーバーライドを微調整して、ケースでハンドルを解放します。

于 2013-04-17T02:50:10.750 に答える