Registry Safety Guidelines
Critical Rules
- •Never delete without confirmation - always show a confirmation dialog before
DeleteSubKeyTree - •ShellEx warnings - when deleting shellex entries, warn that third-party app functionality may break
- •Backup before bulk changes - export to .reg before batch operations
- •Use writable:true explicitly -
OpenSubKey(path, writable: true)- never assume write access - •Catch and handle SecurityException - HKCR writes require admin; gracefully handle permission denied
Registry Paths
| Category | Shell | ShellEx |
|---|---|---|
| All Files | *\shell | *\shellex\ContextMenuHandlers |
| Directory | Directory\shell | Directory\shellex\ContextMenuHandlers |
| Dir Background | Directory\Background\shell | Directory\Background\shellex\ContextMenuHandlers |
| Desktop Background | DesktopBackground\shell | DesktopBackground\shellex\ContextMenuHandlers |
| Drive | Drive\shell | Drive\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\{...}\InprocServer32with 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.