私は .NET 3.5 を使用しています。
CursorInteropHelper.Create()
方法はこちら。ただし、カーソルの IntPtr を SafeHandle に変換する方法はまったく不明です。ここにリストされている SafeHandle の実装のリストには SafeCursorHandleが含まれておらず、その他は抽象的または無関係です。唯一の方法は、SafeHandle の独自の実装を作成することですか?
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() オーバーライドを微調整して、ケースでハンドルを解放します。