如何在 ref class 中正确存储 HWND?

How to properly store an HWND in a ref class?

我正在开发一个与 C# 一起使用的 C++/CLI 。我有一个存储 HWND 的引用 class(直接在托管代码中使用,因此它必须兼容),但我认为我做的不对:

public ref class MyClass {
  protected:
    HWND hWnd;
}

我应该在 ref class 中使用本地指针吗?或者我应该使用 ptr<T>?

之类的东西

原生 pointers/handles 在 ref class 中是完全安全的。 (毕竟它们只是 ints。)然而,将它们存储在 IntPtr class 中会更符合习惯。 (这就是 WinForms stores them 的方式。)

句柄不是指针,HWND 可以。如果您希望 C# 代码从您的 class 派生并访问句柄,那么您需要将其公开为 IntPtr。与句柄兼容,32位模式下为4字节,64位模式下为8字节,就像句柄一样。

最好用 属性 包裹它以隐藏转换:

protected:
    property IntPtr Handle {
        IntPtr get()       { return IntPtr(hwnd); }
        void set(IntPtr h) { hwnd = (HWND)h.ToPointer(); }
    }
private:
    HWND hWnd;

SafeHandle 可能有用,但是 HWND 的生命周期通常不受您的控制。