How to Set a Per-Protocol Default Handler on Windows 11
🔍 WiseChecker

How to Set a Per-Protocol Default Handler on Windows 11

Quick fix: Open Settings → Apps → Default apps → Choose defaults by link type. Scroll to the protocol you want (mailto, http, ms-teams, zoommtg, etc.) and pick the app. For protocols not listed, edit registry HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\<protocol>\UserChoice directly.

You want mailto: links to open Thunderbird, not the new Outlook. You want zoommtg:// links to launch the Zoom client directly without the browser prompt. Windows 11 supports per-protocol handler overrides, but the Settings UI hides some protocols and the rest require knowing exactly where to look.

Symptom: Specific URL protocols (mailto, ms-teams, zoommtg, slack, etc.) open the wrong app or prompt every time.
Affects: Windows 11 (and Windows 10).
Fix time: ~5 minutes per protocol.

ADVERTISEMENT

What causes this

Windows 11 maps each URL protocol to a default application via per-user registry entries. The mapping lives under HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\<protocol>\UserChoice and contains two values: ProgId (the application’s registered handler name) and Hash (a tamper-detection signature). If you write ProgId alone without the matching Hash, Windows treats the entry as tampered and ignores it, falling back to default.

The Settings UI handles the Hash calculation transparently. But it only exposes protocols Windows knows about by name — proprietary URI schemes like zoommtg, slack, discord, and spotify won’t show up unless an app has explicitly registered them.

Method 1: Use Settings → Default apps → Choose defaults by link type

The standard route. Works for any protocol Windows knows about.

  1. Open Settings → Apps → Default apps.
  2. Scroll to the bottom and click Choose defaults by link type. (On older Windows 11 builds, this might be labeled Set defaults by protocol.)
  3. The list shows every protocol Windows knows about: mailto, http, https, ftp, ms-officeapp, ms-teams, etc. Scroll to find the one you want.
  4. Click the protocol entry. A picker shows installed apps that have registered to handle it.
  5. Pick your preferred app. The change applies immediately.
  6. To verify: type the protocol with a colon in the Start menu search box (e.g., mailto:test@example.com) and press Enter. The chosen app should open.

This is the standard, hash-correct route. Use it whenever the protocol is visible in the list.

ADVERTISEMENT

Method 2: Set default through the app itself

For when the app provides its own “Make default” button — often the most reliable route because the app handles the hash calculation correctly.

  1. For email clients (Thunderbird, eM Client): launch the app and look in Tools → Options → General for a button like Make Default or Check now. Click it.
  2. For Zoom: Settings → General → Use Zoom as default app for click-to-launch links. Toggle On.
  3. For Slack: the app prompts on first launch to register as the handler for slack:// URIs.
  4. For Microsoft Teams (new): Teams asks during setup whether to handle ms-teams links. Yes registers it; No leaves the previous handler.
  5. After clicking the in-app button, Windows shows a one-time confirmation: Make this the default? Confirm.

This route is foolproof because the app provides its own ProgId and Windows generates the hash. Use this when available — it’s less error-prone than direct registry editing.

Method 3: Use SetUserFTA for scripted per-protocol changes

For administrators deploying defaults across multiple PCs. Direct registry editing is unreliable because of the hash; SetUserFTA does the hash calculation correctly.

  1. Download SetUserFTA from kolbi.cz/blog/2017/10/25/setuserfta-userchoice-hash-defeated-set-file-type-associations-per-user/ (free utility, widely used in enterprise).
  2. Extract to a folder, e.g., C:\Tools\SetUserFTA.
  3. Find the ProgId of your preferred app. Look in registry: HKEY_CLASSES_ROOT\Applications and find your app’s entry. The ProgId is typically AppName.URL.protocol.
  4. Run from elevated Command Prompt:
    SetUserFTA.exe mailto Thunderbird.Url.mailto

    Replace mailto with the protocol and Thunderbird.Url.mailto with the actual ProgId of the target app.

  5. The tool writes the correct ProgId and computes the matching Hash automatically.
  6. To verify: query the registry: reg query "HKCU\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\mailto\UserChoice". ProgId should match the value you set.
  7. To batch-deploy: create a text file with one mapping per line, then run SetUserFTA with the -l switch to load it.

This is the right approach for fleet deployment. Direct manual registry edits without SetUserFTA will be ignored by Windows because the hash won’t match.

How to verify the fix worked

  • Type the protocol URL in Run dialog (Win + R): e.g., mailto:test@example.com. The chosen app should open.
  • Click a protocol-formatted link in your browser. Windows may prompt “Always use this app to open?” the first time — confirm.
  • Check registry: reg query "HKCU\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\<protocol>\UserChoice" /v ProgId. Should show the app’s registered ProgId.

If none of these work

If Windows keeps reverting protocol defaults to its built-in apps (Edge for http/https, new Outlook for mailto), a Group Policy may be enforcing them. Run gpresult /h C:\gpresult.html and look for User Configuration → Administrative Templates → Windows Components → File Explorer → Set default associations configuration file. If a policy is listed, IT manages the associations via an XML file at a specified path — you can’t override that without admin intervention. For unmanaged PCs where defaults still revert, Windows 11’s “repair” mechanism sometimes restores Microsoft defaults during cumulative updates — re-apply your protocol associations after major updates. For protocols where no app has registered (a custom URI scheme you’re trying to handle yourself), you need to first register the handler in HKEY_CLASSES_ROOT with the protocol name as a key, then use Method 1 or 3 to associate it with your user.

Bottom line: Settings → Choose defaults by link type handles most protocols. For ones the UI hides or for enterprise deployment, SetUserFTA reliably sets the ProgId and the hash together so Windows actually honors the change.

ADVERTISEMENT