2

我正在使用 Windows 8,我想尝试在我的桌面应用程序全屏时禁用默认的边缘手势行为。

我发现这个页面解释了如何在 C++ 中做到这一点。

我的应用程序是一个 WPF/C# 应用程序,我找到了Windows 代码 API 包SetWindowProperty方法来完成这项工作。

问题

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

PropertyKey key = new PropertyKey("32CE38B2-2C9A-41B1-9BC5-B3784394AA44", 2); WindowProperties.SetWindowProperty(this, key, "true");

PropertyKey key = new PropertyKey("32CE38B2-2C9A-41B1-9BC5-B3784394AA44", 2); WindowProperties.SetWindowProperty(this, key, "-1");

PropertyKey key = new PropertyKey("32CE38B2-2C9A-41B1-9BC5-B3784394AA44", 2); WindowProperties.SetWindowProperty(this, key, "VARIANT_TRUE");

正如你所看到的,参数必须是一个字符串,但没有人可以工作。

如果有人有想法,请提前致谢!

4

3 回答 3

2

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

设置System.AppUserModel.PreventPinning属性的代码很简单:

public static void PreventPinning(Window window)
{
    var preventPinningProperty = new PropertyKey(new Guid("9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3"), 9);
    WindowProperties.SetWindowProperty(window, preventPinningProperty, "1");
}
于 2014-10-02T13:37:47.880 回答
0

如果您查看原始签名,该函数需要一个IntPtr句柄、一个GuidID 和一个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);

您可以IPropertyStorePInvoke.net获取界面:

[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);
于 2013-05-29T14:00:47.323 回答
0

我不知道如何传递正确的参数,这是一个布尔值。如您所见,参数必须是一个字符串,但没有人可以工作。

传递字符串"1"fortrue"0"for false

于 2016-04-29T15:37:54.337 回答