A ProgID is the link between a Windows file type or protocol and the application that handles it. Understanding that link makes it much easier to inspect, troubleshoot, and deploy default associations.
The essential distinction: registering a ProgID tells Windows that an application can handle a file type. Selecting that ProgID as the user’s default tells Windows which application it should use.
What is a ProgID?
For Windows Shell file associations, a programmatic identifier (ProgID) is a registry key that describes a file type or protocol handler. A typical name combines a vendor or application name with a component, for example Contoso.TextFile.
The ProgID can define a friendly type name, an icon, and Shell verbs such as open, print, or edit. The command below the shell\open\command key tells Windows which executable to launch:
HKEY_CLASSES_ROOT\Contoso.TextFile
(Default) = "Contoso Text Document"
DefaultIcon
(Default) = "C:\Program Files\Contoso\Contoso.exe,0"
shell
open
command
(Default) = "\"C:\Program Files\Contoso\Contoso.exe\" \"%1\""
Here, %1 is replaced with the path of the file being opened. The ProgID does not itself make .txt files open with Contoso; it only describes the handler that Windows can use.
Terminology note: ProgIDs are also used by COM. This article focuses on the Shell ProgIDs used for file and protocol associations.
How a file association fits together
A file association connects an extension or protocol to a ProgID. The ProgID then resolves to the application command:
.txt → Contoso.TextFile → shell\open\command → Contoso.exe "%1"
The same principle applies to protocols:
https → BrowserHTML → browser launch command
Applications normally register their supported ProgIDs during installation. Windows can then present those applications as available handlers. Registration alone does not make an application the current user’s default.
Where ProgIDs are stored
ProgID definitions can be registered for the entire computer or only for the current user.
Machine-wide registration
HKEY_LOCAL_MACHINE\Software\Classes\<ProgID>
ProgIDs registered here are available to all users of the computer.
Per-user registration
HKEY_CURRENT_USER\Software\Classes\<ProgID>
ProgIDs registered here are available only to the current user. A per-user entry can override a machine-wide entry with the same key name.
What HKEY_CLASSES_ROOT shows
HKEY_CLASSES_ROOT (HKCR) is not a separate copy of this information. It is a merged view of the machine-wide and per-user Software\Classes locations:
HKEY_CURRENT_USER\Software\Classes
+
HKEY_LOCAL_MACHINE\Software\Classes
↓
HKEY_CLASSES_ROOT
This merged view lets applications query the effective class and association data for the interactive user. Microsoft documents the exact merge behavior in Merged View of HKEY_CLASSES_ROOT.
Registration is not the same as the user’s default
This distinction is especially important on modern Windows:
- ProgID registration describes an available handler and its commands.
- Default-app selection records which registered handler the current user has selected for an extension or protocol.
Windows stores current per-user choices in UserChoice keys. Examples include:
# File extension
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice
# URL protocol
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice
On current Windows versions, these selections are protected. Directly changing a ProgID definition, running assoc or ftype, or writing a machine-wide extension mapping does not reliably replace the current user’s default.
Practical rule: create or install the ProgID first. Then assign the extension or protocol to that ProgID for the user.
How to identify the correct ProgID
Before changing an association, confirm that the target ProgID exists and resolves to the expected executable. SetUserFTA can show the effective association, its location, the ProgID, and the resolved command line:
SetUserFTA.exe query .pdf
To inspect all current user associations:
SetUserFTA.exe get
For browsers, use the dedicated command to list installed browsers and their ProgIDs:
SetUserFTA.exe browser
Once you have verified the target ProgID, you can assign it to an extension or protocol:
SetUserFTA.exe set .pdf <ProgID>
SetUserFTA.exe set https <ProgID>
See the SetUserFTA query documentation for the complete syntax and output.
Creating or repairing a ProgID
If the application does not register a usable ProgID, the ProgID must be created or repaired before it can be selected as a working association. At minimum, the ProgID needs a valid shell\open\command. A friendly name and icon are also recommended.
ProgIDTool can display, copy, export, rename, delete, and register file-type ProgIDs without requiring you to edit every registry value manually.
Summary
- A ProgID describes how Windows should handle a file type or protocol.
- ProgIDs can be registered machine-wide or for the current user.
HKEY_CLASSES_ROOTis a merged view of those registration locations.- Registering a ProgID does not automatically make it the user’s default.
- Verify that a ProgID exists and resolves correctly before assigning it with SetUserFTA.