WPF应用如何禁止用户将程序固定到Windows开始菜单与任务栏
问题原因汇总
方案1的核心错误
- 不存在属性ID为12的
System.AppUserModel.PreventStartPinning属性:微软官方定义的System.AppUserModel.PreventPinning属性的PID固定为9,该属性同时控制禁止固定到任务栏和开始菜单,你自定义的PID12属性无任何系统逻辑对应,自然不会生效。 - 属性值类型错误:
System.AppUserModel.PreventPinning是布尔类型属性,你传入字符串"True"会导致系统读取属性失败,应传入布尔值true。 - 修正后的方案1代码示例:
public void PreventPin() { // 注意:此方法必须在窗口调用Show()之前执行,窗口显示后设置属性不会生效 Window parentWindow = Window.GetWindow(ShellWindow); string appID = "UI"; Guid propGuid = new Guid("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}"); PropertyKey idProperty = new PropertyKey(propGuid, 5); PropertyKey preventPinning = new PropertyKey(propGuid, 9); // 必须先设置PreventPinning再设置AppID WindowProperties.SetWindowProperty(parentWindow, preventPinning, true); WindowProperties.SetWindowProperty(parentWindow, idProperty, appID); }
方案2的核心错误
- 注册表项配置规则错误:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileAssociation\NoStartPageAppUserModelIDs路径下,需要新建**名称为你的AppID(即"UI")**的空字符串值,而非新建值为"UI"的条目,很多开发者会搞反值名和值内容的关系。 - 权限要求:修改HKLM路径下的注册表项需要程序获得管理员权限运行,普通权限下写入会被系统拦截,配置不生效。
- 生效条件:修改该注册表项后需要重启资源管理器(Explorer.exe)才会生效,即时修改不会立刻起作用。
通用注意事项
- 属性设置时机错误:窗口的AppUserModel相关属性必须在窗口显示(调用Show()方法)之前设置,窗口渲染完成后系统已经读取过属性,后续修改不会被捕获,需要重启程序才会生效。
- 快捷方式兼容:如果你的应用在开始菜单或桌面创建了快捷方式,需要在快捷方式的属性中也设置相同的AppID和
PreventPinning属性,否则用户右键点击快捷方式时仍然可以看到固定到开始菜单/任务栏的选项。
内容的提问来源于stack exchange,提问作者Ciaran Martin
相关产品推荐
相关产品推荐

