AgentSkillsCN

win-registry-safety

Windows注册表操作安全指南——适用于上下文菜单编辑。在修改、添加或删除HKCR(HKEY_CLASSES_ROOT)下的注册表键值、实现启用/禁用切换,或处理shell/shellex条目时使用此功能。可通过“任何调用Registry.ClassesRoot、CreateSubKey、DeleteSubKeyTree,或修改上下文菜单注册表路径的代码”等短语触发。

SKILL.md
--- frontmatter
name: win-registry-safety
description: "Windows registry operation safety guidelines for context menu editing. Use when modifying, adding, or deleting registry keys under HKCR (HKEY_CLASSES_ROOT), implementing enable/disable toggles, or working with shell/shellex entries. Triggers on: any code that calls Registry.ClassesRoot, CreateSubKey, DeleteSubKeyTree, or modifies context menu registry paths."

Registry Safety Guidelines

Critical Rules

  1. Never delete without confirmation - always show a confirmation dialog before DeleteSubKeyTree
  2. ShellEx warnings - when deleting shellex entries, warn that third-party app functionality may break
  3. Backup before bulk changes - export to .reg before batch operations
  4. Use writable:true explicitly - OpenSubKey(path, writable: true) - never assume write access
  5. Catch and handle SecurityException - HKCR writes require admin; gracefully handle permission denied

Registry Paths

CategoryShellShellEx
All Files*\shell*\shellex\ContextMenuHandlers
DirectoryDirectory\shellDirectory\shellex\ContextMenuHandlers
Dir BackgroundDirectory\Background\shellDirectory\Background\shellex\ContextMenuHandlers
Desktop BackgroundDesktopBackground\shellDesktopBackground\shellex\ContextMenuHandlers
DriveDrive\shellDrive\shellex\ContextMenuHandlers
Extension.ext -> ProgID -> {ProgID}\shell{ProgID}\shellex\ContextMenuHandlers

Enable/Disable Patterns

  • Shell items: set LegacyDisable (REG_SZ, empty) to disable; delete value to enable
  • ShellEx items: rename key with - prefix to disable (e.g., MyHandler -> -MyHandler); preserve default value (CLSID) during rename

Win11 Classic Menu

  • CLSID: {86ca1aa0-34aa-4e8b-a509-50c905bae2a2}
  • Force classic: create HKCU\Software\Classes\CLSID\{...}\InprocServer32 with empty default value
  • Revert: delete the CLSID subtree under HKCU
  • Requires Explorer restart to take effect

Safe Coding Patterns

csharp
// Always use 'using' for registry keys
using var key = Registry.ClassesRoot.OpenSubKey(path, writable: true);
if (key == null) return; // guard against missing keys

// Delete values safely
key.DeleteValue("ValueName", throwOnMissingValue: false);

// Delete subkeys safely
parentKey.DeleteSubKeyTree(keyName, throwOnMissingSubKey: false);

For detailed registry path reference, see references/registry-paths.md.