本篇博文我仅仅是作为记录者,实际上发现并编码的是我们组的小伙伴天保同学。

我们组小伙伴有个需求,需要将WPF应用的 任务栏右键菜单菜单,不显示“固定到任务栏”

如下图:

普通窗口的任务栏右键菜单:

但是发现部分窗口有只显示 “关闭窗口”

“微信公众号”的窗口

微软的官方文档:System.AppUserModel.PreventPinning - Win32 apps | Microsoft Learn 禁用将快捷方式或窗口固定到任务栏或 开始 菜单的功能。 此属性还使项无法包含在 “开始” 菜单的“最常用的”(MFU)列表中。

1、首先定义System.AppUserModel.PreventPinning:ROPERTYKEY(new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}"), 9):详情看propertyKey的参数解释:propertyKEY (wtypes.h) - Win32 apps | Microsoft Learn

2、给IPropertyStore 定义 IID Guid IID_IPropertyStore = new Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99");

3、调用shell32 的 SHGetPropertyStoreForWindow实现 禁用的功能

代码如下:

 public class NativeWin32
{
[DllImport("shell32.dll")]
public static extern int SHGetPropertyStoreForWindow(IntPtr hwnd, ref Guid riid, out IPropertyStore propertyStore); [DllImport("ole32.dll")]
public static extern int PropVariantClear(ref PROPVARIANT pvar); // Define IPropertyStore interface
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99")]
public interface IPropertyStore
{
void GetCount(out uint cProps);
void GetAt(uint iProp, out PROPERTYKEY pkey);
void GetValue(ref PROPERTYKEY key, out PROPVARIANT pv);
void SetValue(ref PROPERTYKEY key, ref PROPVARIANT pv);
void Commit();
} // Define IID for IPropertyStore
public static Guid IID_IPropertyStore = new Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"); // Define PROPERTYKEY struct
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct PROPERTYKEY
{
public Guid fmtid;
public uint pid; public PROPERTYKEY(Guid fmtid, uint pid)
{
this.fmtid = fmtid;
this.pid = pid;
}
} // Define PROPVARIANT structure (simplified, we'll use a simple one for bool)
[StructLayout(LayoutKind.Explicit)]
public struct PROPVARIANT
{
// We'll only implement the necessary part for boolean
[FieldOffset(0)] public ushort vt;
[FieldOffset(8)] public byte boolVal; public void SetValue(bool value)
{
// VT_BOOL
vt = 11;
boolVal = value ? (byte)1 : (byte)0;
}
}
}

在窗口加载的时候调用方法:

 public MainWindow()
{
InitializeComponent();
SourceInitialized += MainWindow_SourceInitialized;
} private void MainWindow_SourceInitialized(object? sender, EventArgs e)
{
SetPinning();
} private void SetPinning()
{
//return;
IntPtr hwnd = new WindowInteropHelper(this).Handle; // Define the property key for System.AppUserModel.PreventPinning
NativeWin32.PROPERTYKEY propKey = new NativeWin32.PROPERTYKEY(new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}"), 9); // Get the IPropertyStore for the window
NativeWin32.IPropertyStore propStore;
int hr = NativeWin32.SHGetPropertyStoreForWindow(hwnd, ref NativeWin32.IID_IPropertyStore, out propStore);
if (hr != 0) // if failed
{
Marshal.ThrowExceptionForHR(hr);
} try
{
// Create a PROPVARIANT with bool value: true
NativeWin32.PROPVARIANT pv = new NativeWin32.PROPVARIANT();
pv.SetValue(true); // Set the property
propStore.SetValue(ref propKey, ref pv); // We must free the PROPVARIANT
NativeWin32.PropVariantClear(ref pv);
}
finally
{
// Release the IPropertyStore
Marshal.ReleaseComObject(propStore);
}
}

结果如下:

参考资料:

propertyKEY (wtypes.h) - Win32 apps | Microsoft Learn

System.AppUserModel.PreventPinning - Win32 apps | Microsoft Learn

应用程序用户模型 ID (AppUserModelIDs) - Win32 apps | Microsoft Learn

记录win11下,WPF设置 System.AppUserModel.PreventPinning 属性用于阻止用户将应用程序固定到任务栏的更多相关文章

  1. WPF设置VistualBrush的Visual属性制作图片放大镜效果

    原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...

  2. 在Winform或WPF中System.Diagnostics.Process.Start的妙用

    原文:在Winform或WPF中System.Diagnostics.Process.Start的妙用 我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑 ...

  3. 记录Linux下安装elasticSearch时遇到的一些错误

    记录Linux下安装elasticSearch时遇到的一些错误 http://blog.sina.com.cn/s/blog_c90ce4e001032f7w.html (2016-11-02 22: ...

  4. MTU介绍以及在windows和linux下怎么设置MTU值

    最大传输单元MTU(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡 ...

  5. iOS 11 导航栏 item 偏移问题 和 Swift 下 UIButton 设置 title、image 显示问题

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. WPF设置软件界面背景为MediaElement并播放视频

    在我们的常见的软件界面设计中我们经常会设置软件的背景为SolidColorBrush或者LinerColorBrush.RadialGradientBrush 等一系列的颜色画刷为背景,有时我们也会使 ...

  7. Mac下如何设置Eclipse默认浏览器为chrome

    http://stackoverflow.com/questions/5322574/how-can-i-set-chrome-as-default-external-browser-in-eclip ...

  8. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

  9. WPF 设置了阴影效果后,Y轴位置会有变化的问题

    原文:WPF 设置了阴影效果后,Y轴位置会有变化的问题 背景 最近遇到一个动画执行时,文本位置变化的问题.如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素. 貌似有点莫名其妙,因为控件之 ...

  10. wpf设置设计时的ViewModel

    原文:wpf设置设计时的ViewModel wpf mvvm开发中,有些情况下,你的view不一定设置DataContext,但是你又想在设计阶段,能够自动提示你的view绑定的viewmodel的内 ...

随机推荐

  1. E - Stamp

    题目链接 : E - Stamp (atcoder.jp) 题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变 ...

  2. FastAPI与MongoDB分片集群:异步数据路由与聚合优化

    title: FastAPI与MongoDB分片集群:异步数据路由与聚合优化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author ...

  3. 鸿蒙版《智慧农业APP》通过华为云IoT平台实现软件硬件互联

    一.原理图 本篇不涉及硬件相关的功能开发,硬件设备使用MQTT客户端模拟,如果有硬件相关经验的可以直接使用真实硬件代替MQTT客户端. 1.华为云物联网服务器 华为云物联网平台是硬件设备端跟移动APP ...

  4. L1-5、Prompt 写作中的常见误区

    语言很自然,但写法要"工程化". 为什么要重视 Prompt 的写作规范? Prompt 是"给 AI 的任务指令",不清不楚,AI 就会"乱猜&qu ...

  5. obs学习之4——枚举设备、选择设备

    obs学习之4--枚举设备.选择设备

  6. 全球首个无限执行的 AI 出现!给我玩爽了

    给 AI 一句话,它就能自主执行任务,生成复杂的大型网站.几十页的 PPT.万字爆款图文.千万字长篇小说? 据说这是世界上第一款无限的 AI 智能体 -- Flowith. 无限这个词听起来有点东西啊 ...

  7. Docker修改Devicemapper存储驱动为Direct-lvm模式

    一.说明 Device mapper是基于内核的框架,支持Linux上许多高级卷管理技术.Docker中devicemapper存储驱动程序利用此框架的精简配置和快照功能进行镜像和容器管理. devi ...

  8. 记一次 .NET 某无语的电商采集系统 CPU爆高分析

    一:背景 1. 讲故事 前段时间有位朋友微信上找到我,说他们docker中的采集程序出现了CPU爆高的情况,让我帮忙看下怎么回事,自己抓了个dump,感觉这位朋友动手能力还是比较强的,可能调试这块知识 ...

  9. 实战干货|Spark 在袋鼠云数栈的深度探索与实践

    Spark 是一个快速.通用.可扩展的大数据计算引擎,具有高性能.易用.容错.可以与 Hadoop 生态无缝集成.社区活跃度高等优点.在实际使用中,具有广泛的应用场景: · 数据清洗和预处理:在大数据 ...

  10. Java集合--从本质出发理解HashMap

    文章内容较长,放宽心,带着疑问慢慢读,总能找到你想要的答案. 如何快速定位数据存储在内存地址的位置? 先提出一个问题:如何快速定位数据存储在内存地址的位置? 聪明的你会想到使用数组:根据首地址+单个节 ...