如何通过Windows API (VARIANT_TRUE)设置窗口属性



我在Windows 8上工作,我想在桌面应用程序全屏时禁用默认的边缘手势行为。

我找到了这个页面,它解释了如何在c++中做到这一点。

我的应用程序是一个WPF/c#应用程序,我已经找到了Windows Code API包和SetWindowProperty方法来完成作业。

我不知道如何传递正确的参数,这是一个布尔值:

PropertyKey key = newPropertyKey (32 ce38b2-2c9a-41b1-9bc5-b3784394aa44 ", 2);WindowProperties。

SetWindowProperty(this, key, "true");

PropertyKey key = newPropertyKey (32 ce38b2-2c9a-41b1-9bc5-b3784394aa44 ", 2);WindowProperties。

SetWindowProperty(this, key, "-1");

PropertyKey key = newPropertyKey (32 ce38b2-2c9a-41b1-9bc5-b3784394aa44 ", 2);WindowProperties。settwindowproperty (this, key, "VARIANT_TRUE");

如你所见,形参必须是一个字符串,但没有一个有效。

如果有人有主意,请提前感谢!

一个更简单的解决方案是使用Windows API Code Pack。

代码设置System.AppUserModel。preventpin 属性就像这样简单:

public static void PreventPinning(Window window)
{
    var preventPinningProperty = new PropertyKey(new Guid("9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3"), 9);
    WindowProperties.SetWindowProperty(window, preventPinningProperty, "1");
}

如果您查看原始签名,则该函数需要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.net获取IPropertyStore接口:

[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);

我不知道如何传递正确的参数,这是一个布尔值。如你所见,形参必须是一个字符串,但没有一个是有效的。

true传递字符串"1",为false传递字符串"0"

相关内容

  • 没有找到相关文章

最新更新