我正在Windows 8上工作,当我的桌面应用程序是全屏时,我想尝试禁用默认的边缘手势行为。
我找到了这个页面,它解释了如何在C++中实现它。
我的应用程序是一个WPF/C#应用程序,我找到了Windows代码API包和SetWindowProperty方法来执行任务。
问题
我不知道如何传递正确的参数,这是一个布尔值:
PropertyKey key = new PropertyKey 2);WindowProperties.SetWindowProperty(this,key,"true"); PropertyKey key = new PropertyKey 2);WindowProperties.SetWindowProperty(this,key,"-1"); PropertyKey key = new PropertyKey 2);WindowProperties.SetWindowProperty(this,key,"VARIANT_TRUE");
如您所见,参数必须是字符串,但没有人工作。
如果有人有主意,请提前感谢!
发布于 2014-10-02 13:37:47
一个更简单的解决方案是使用Windows API代码包。
代码设置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");
}
发布于 2013-05-29 14:00:47
如果您查看原始签名,该函数需要一个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);
您可以从IPropertyStore
中获取PInvoke.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);
发布于 2016-04-29 15:37:54
我不知道如何传递正确的参数,这是一个布尔值。如您所见,参数必须是字符串,但没有人工作。
将字符串"1"
传递给true
,传递"0"
传递给false
。
https://stackoverflow.com/questions/16810634
复制相似问题