首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过Windows (VARIANT_TRUE)设置窗口属性?

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

Stack Overflow用户
提问于 2013-05-29 09:47:40
回答 3查看 2.8K关注 0票数 2

我正在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");

如您所见,参数必须是字符串,但没有人工作。

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

EN

回答 3

Stack Overflow用户

发布于 2014-10-02 13:37:47

一个更简单的解决方案是使用Windows API代码包

代码设置System.AppUserModel.PreventPinning属性将与以下操作一样简单:

代码语言:javascript
运行
复制
public static void PreventPinning(Window window)
{
    var preventPinningProperty = new PropertyKey(new Guid("9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3"), 9);
    WindowProperties.SetWindowProperty(window, preventPinningProperty, "1");
}
票数 2
EN

Stack Overflow用户

发布于 2013-05-29 14:00:47

如果您查看原始签名,该函数需要一个IntPtr句柄、一个Guid id和一个将由数据填充的PropertyStore对象。

代码语言:javascript
运行
复制
HRESULT SHGetPropertyStoreForWindow(
  _In_   HWND hwnd,
  _In_   REFIID riid,
  _Out_  void **ppv
);

将其转换为c#如下所示:

代码语言:javascript
运行
复制
[DllImport("shell32.dll", SetLastError = true)]
 static extern int SHGetPropertyStoreForWindow(
        IntPtr handle,
        ref Guid riid,
        out IPropertyStore propertyStore);

您可以从IPropertyStore中获取PInvoke.net接口。

代码语言:javascript
运行
复制
[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中找到。

实现之后,您应该能够简单地调用该方法并设置属性:

代码语言:javascript
运行
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2016-04-29 15:37:54

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

将字符串"1"传递给true,传递"0"传递给false

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16810634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档