记录win11下,WPF设置 System.AppUserModel.PreventPinning 属性用于阻止用户将应用程序固定到任务栏
本篇博文我仅仅是作为记录者,实际上发现并编码的是我们组的小伙伴天保同学。
我们组小伙伴有个需求,需要将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 属性用于阻止用户将应用程序固定到任务栏的更多相关文章
- WPF设置VistualBrush的Visual属性制作图片放大镜效果
原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...
- 在Winform或WPF中System.Diagnostics.Process.Start的妙用
原文:在Winform或WPF中System.Diagnostics.Process.Start的妙用 我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑 ...
- 记录Linux下安装elasticSearch时遇到的一些错误
记录Linux下安装elasticSearch时遇到的一些错误 http://blog.sina.com.cn/s/blog_c90ce4e001032f7w.html (2016-11-02 22: ...
- MTU介绍以及在windows和linux下怎么设置MTU值
最大传输单元MTU(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡 ...
- 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 ...
- WPF设置软件界面背景为MediaElement并播放视频
在我们的常见的软件界面设计中我们经常会设置软件的背景为SolidColorBrush或者LinerColorBrush.RadialGradientBrush 等一系列的颜色画刷为背景,有时我们也会使 ...
- Mac下如何设置Eclipse默认浏览器为chrome
http://stackoverflow.com/questions/5322574/how-can-i-set-chrome-as-default-external-browser-in-eclip ...
- MVVM模式下WPF动态绑定展示图片
MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...
- WPF 设置了阴影效果后,Y轴位置会有变化的问题
原文:WPF 设置了阴影效果后,Y轴位置会有变化的问题 背景 最近遇到一个动画执行时,文本位置变化的问题.如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素. 貌似有点莫名其妙,因为控件之 ...
- wpf设置设计时的ViewModel
原文:wpf设置设计时的ViewModel wpf mvvm开发中,有些情况下,你的view不一定设置DataContext,但是你又想在设计阶段,能够自动提示你的view绑定的viewmodel的内 ...
随机推荐
- QQ会员首页HTML+CSS
作为一个穷人,唯一一次逛这么久的会员首页还是因为要写最头大的web~苦涩 效果图 源码 <!DOCTYPE html> <html> <head> <meta ...
- 为什么阿里的dubbo注册中心要放弃zookeeper, 而用Nacos?
首先,那么为什么说zookeeper不适合做服务注册中心呢? 从CAP角度来看 有个思考,从CAP角度考虑,服务注册中心是CP系统还是AP系统呢? 首先,服务注册中心是为了服务间调用服务的,那么绝对不 ...
- centos 7 安装 netcoresdk 和Nginx 并发布netcore
微软官网的yum安装: 打开linux终端程序 netcore sdk 地址https://dotnet.microsoft.com/download/linux-package-manager/ce ...
- SynchronizedHashMap和ConcurrentHashMap的区别
ConcurrrentHashMap ConcurrentHashMap 使用锁分离技术来保证在多线程下的性能.它每次锁住一个桶,默认将 hash 表分为 16 个桶,诸如put和remove 等 ...
- Android Studio 虚拟机一直黑屏原因及解决办法
虚拟机一直黑屏原因: android模拟器在创建时,一般默认设置为热启动,所以每次关闭模拟器时,会提示保存当前运行界面状态,若选择取消,则下一次启动会以最近一次保存的状态启动显示.如果某次关闭时保存的 ...
- Bootstrap Table强大的web数据表格渲染框架
Bootstrap Table 是什么 Bootstrap Table 是一个基于 Bootstrap 框架的开源插件,专为快速构建功能丰富.响应式的数据表格而设计. 它支持排序.分页.搜索.导出 ...
- 如何从Docker image提取 Dockerfile
参考链接:https://github.com/cucker0/dockerimage2df 参考链接:https://github.com/cucker0/docker/blob/main/md/由 ...
- ATM1.0面条版test
[一]功能概要 [1]注册 [2]登陆 [3]取款 [4]存款 [5]查看流水 [6]查看银行信息(查看自己的卡号.余额) [7]初始化银行信息 [8]退出 [二]功能需求 [1]注册 (1)身份信息 ...
- hot100之二分查找
搜索插入位置(035) class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; ...
- redis可视化管理客户端和数据备份
在我的印象中,redis的客户端都是一些命令行. 不过前一阵子,使用了yunedit-redis这个图形化管理的客户端,就再也不想使用命令行了.它不仅能图形化管理redis的数据,还可以在客户端做数据 ...