元の署名を見ると、関数にはIntPtr
ハンドル、Guid
ID、およびPropertyStore
データが取り込まれるオブジェクトが必要です。
HRESULT SHGetPropertyStoreForWindow(
_In_ HWND hwnd,
_In_ REFIID riid,
_Out_ void **ppv
);
これを c# に翻訳すると、次のようになります。
[DllImport("shell32.dll", SetLastError = true)]
static extern int SHGetPropertyStoreForWindow(
IntPtr handle,
ref Guid riid,
out IPropertyStore propertyStore);
また、 PInvoke.netIPropertyStore
からインターフェイスを取得できます。
[ComImport, Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IPropertyStore
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetCount([Out] out uint cProps);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetAt([In] uint iProp, out PropertyKey pkey);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void GetValue([In] ref PropertyKey key, out object pv);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void SetValue([In] ref PropertyKey key, [In] ref object pv);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void Commit();
}
あとは、実際に を実装するだけですPropertyStore
。.net フレームワークでの同様の実装は、たとえばPrintSystemObjectにあります。
これを実装した後は、メソッドを呼び出してプロパティを設定するだけです。
IPropertyStore store = new PropertyStore();
//your propery id in guid
var g = new Guid("32CE38B2-2C9A-41B1-9BC5-B3784394AA44");
SHGetPropertyStoreForWindow(this.Handle, ref g, out store);