查看: 429|回复: 0

WPF按应用设置GPU偏好:读写注册表并清理失效项

[复制链接]
发表于 5 小时前 | 显示全部楼层 |阅读模式
Windows 自带的按应用指定 GPU 功能入口较深,应用一多就不方便搜索和批量操作;程序卸载或移动后,UserGpuPreferences 中还会留下指向不存在路径的偏好记录。原文作者的 GPUSwitcher 正是围绕这一点做的 WPF 单文件小工具:180KB,双击即用,重点不在复杂算法,而在把注册表读写、批量操作和残留清理做顺手。

一、核心机制:只改一个用户级注册表键

每应用 GPU 偏好存放在 HKCU\Software\Microsoft\DirectX\UserGpuPreferences。值名是 exe 路径,值内容形如 GpuPreference=2;。其中 0 表示让系统决定,1 表示省电(核显),2 表示高性能(独显)。原文明确,读写该键不需要管理员权限,修改即时生效,并且与系统设置页等价、两边互相可见。由此可推导,这类工具适合作为系统功能的轻量封装,配置源仍是同一个用户级注册表位置,不会引入额外配置中心。

核心设置逻辑代码量不大:
  1. using (var key = Registry.CurrentUser.CreateSubKey(KEY_PATH))
  2. {
  3.     key.SetValue(exePath, "GpuPreference=2;", RegistryValueKind.String);
  4. }
复制代码

真正耗费精力的是 UI 和交互细节。

二、WPF 实现与交互细节

原文工具是纯代码手写 WPF,没有使用 XAML,以便保持单文件结构。界面包含圆角卡片、彩色状态徽章(红=独显·高性能,青=核显·省电,灰=自动,橙=失效)、行悬停高亮和按钮悬停反馈。交互上做了搜索过滤,45 条记录可实时过滤并显示“筛选出 N / M”;支持 Ctrl / Shift 多选后批量设置,按钮前有“将所选应用设为:”引导;双击列表行可按当前偏好直接启动应用。文案也做了消歧:将“恢复默认”改为“自动”,将“移除”改为“删除记录”,并标注“不卸载程序”。

三、两个实际踩坑

第一个坑是 WPF 数据绑定不支持字段。数据类最初把 ExePath 和 Pref 定义为公开字段,编译运行正常,但徽章彩色背景绑定静默失败,出现白色文字落在白色卡片上的现象。WPF 数据绑定只认属性,改成 { get; set; } 后解决。这个问题的启示是:WPF 绑定失败不一定抛异常,字段和属性的差异要在数据模型设计阶段就规避。

第二个坑是失效残留检测的交互。检测本身只需 File.Exists(exePath),但要做对提示:失效条目标橙色“⚠ 文件不存在”徽章;勾选失效项去设置 GPU 时给出明确提示而不是报错;清理弹窗预览所有将被删除的路径,并写清“只删 GPU 偏好记录,不卸载任何软件”。这样用户不会把配置清理误解为程序卸载。

四、效果与适用场景

原文作者打开自己的列表时,45 条记录中有 17 条失效,例如 J:\Naraka、D:\leidian\LDPlayer9,都是已删除的游戏和模拟器。工具可一键把 Chrome、微信、会议软件批量设为核显,游戏设为独显,并一键清空 17 条卸载残留。单文件 exe 双击即用,秒开秒关,依赖 WPF 硬件加速渲染。对于需要频繁调整每应用 GPU 偏好的 Windows 桌面用户和开发者,这个案例的价值在于:先确认系统已有注册表机制,再做轻量封装;把批量、搜索、失效检测和文案提示补齐;同时注意 WPF 绑定属性、失效路径提示等容易忽略的细节。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-18 17:22 , Processed in 0.027226 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部