我在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"
。