預設程式
使用 預設程式 來設定預設使用者體驗。 使用者可以從主控台或直接從 [開始] 功能表存取預設程式。 設定 Program Access and Computer Defaults (SPAD) 工具,這是 Windows XP 中使用者的主要預設體驗,現在是 預設程式的一部分。
重要
本主題不適用於Windows 10。 預設檔案關聯在 Windows 10 中運作的方式。 如需詳細資訊,請參閱本文中Windows 10如何處理預設應用程式的變更一節。
當使用者使用 預設程式設定程式預設值時,預設設定只會套用至該使用者,而不會套用至可能使用相同的電腦的其他使用者。 預設程式提供Windows 8) 中 (淘汰的一組 API,可讓獨立軟體廠商 (ISV) ,使其程式或應用程式包含在預設系統中。 API 集合也可協助 ISV 更妥善地將其狀態管理為預設值。
本主題的組織方式如下:
預設程式及其相關 API 集簡介
預設程式 主要是針對使用標準檔案類型的應用程式而設計,例如.mp3或.jpg檔案或標準通訊協定,例如 HTTP 或 mailto。 使用自己專屬通訊協定和檔案關聯的應用程式通常不會使用 預設程式 功能。
註冊預設 程式 功能的應用程式之後,可以使用 API 集合來取得下列選項和功能:
- 還原應用程式的所有已註冊預設值。 已淘汰Windows 8。
- 還原應用程式的單一已註冊預設值。 已淘汰Windows 8。
- 在單一呼叫中查詢特定預設值的擁有者,而不是搜尋登錄。 您可以查詢檔案關聯、通訊協定或 [開始] 功能表標準動詞的預設值。
- 針對使用者可以設定個別預設值的特定應用程式啟動 UI。
- 移除所有使用者關聯。
預設程式 也提供 UI,可讓您註冊應用程式,以便向使用者提供其他資訊。 例如,數位簽署的應用程式可以包含製造商首頁的 URL。
使用相關聯的 API 集合可協助應用程式在 Windows Vista 中引進的使用者帳戶控制 (UAC) 功能下正確運作。 在 UAC 下,系統管理員會以標準使用者身分向系統顯示,讓系統管理員通常無法寫入 HKEY_LOCAL_MACHINE 子樹。 這項限制是一項安全性功能,可防止程式以系統管理員身分擔任系統管理員。
使用者的程式安裝通常會以提升許可權的程式執行。 不過,應用程式嘗試修改機器層級安裝後的預設關聯線為將會失敗。 相反地,預設值必須在每個使用者層級上註冊,以防止多個使用者覆寫彼此的預設值。
檔案和通訊協定關聯的階層式登錄結構優先于每一使用者預設,而非電腦層級預設值。 有些應用程式在其程式碼中包含點,這些點會在宣告 在 HKEY_LOCAL_MACHINE中註冊的預設值時,暫時提高其許可權。 如果另一個應用程式已經註冊為每個使用者預設值,這些應用程式可能會發生非預期的結果。 使用 預設程式 可防止這種模棱兩可,並保證每個使用者層級的預期結果。
註冊應用程式以搭配預設程式使用
本節說明向 預設程式註冊應用程式所需的登錄子機碼和值。 其中包含完整的範例。
本節包含下列主題:
預設程式 要求每個應用程式明確註冊應用程式應列為可能預設值的檔案關聯、MIME 關聯和通訊協定。 您可以使用下列登錄元素來註冊關聯,本主題稍後會在 [註冊子機碼] 和 [值描述] 底下詳細說明:
HKEY_LOCAL_MACHINE
%ApplicationCapabilityPath%
ApplicationDescription
ApplicationName
Hidden
FileAssociations
.file-extension1
.file-extension2
...
.file-extensionX
MIMEAssociations
MIME
Startmenu
StartmenuInternet
Mail
UrlAssociations
url-scheme
SOFTWARE
RegisteredApplications
Unique Application Name = %ApplicationCapabilityPath%
下列範例顯示名為 WebBrowser 之虛構 Contoso 瀏覽器的登錄專案:
HKEY_LOCAL_MACHINE
SOFTWARE
Contoso
WebBrowser
Capabilities
ApplicationDescription = This award-winning Contoso browser is better than ever. Search the Internet and find exactly what you want in just seconds. Use integrated tabs and new phishing detectors to enhance your Internet experience.
FileAssociations
.htm = ContosoHTML
.html = ContosoHTML
.shtml = ContosoHTML
.xht = ContosoHTML
.xhtml = ContosoHTML
Startmenu
StartmenuInternet = Contoso.exe
UrlAssociations
http = Contoso.Url.Http
https = Contoso.Url.Https
ftp = Contoso.Url.ftp
SOFTWARE
RegisteredApplications
Contoso.WebBrowser.1.06 = SOFTWARE\Contoso\WebBrowser\Capabilities
ProgIDs
應用程式必須提供特定的 ProgID。 請務必包含通常會寫入延伸模組之泛型預設子機碼中的所有資訊。 例如,虛構的 Litware 媒體播放機會提供應用程式特定的HKEY_LOCAL_MACHINESOFTWARE\類別\LitwarePlayer11.AssocFile.MP3\ 子機碼。 該子機碼包含泛型預設子機碼中的所有資訊,HKEY_LOCAL_MACHINE\SOFTWARE\類別\.mp3加上您想要應用程式註冊的任何其他資訊。 這可確保如果使用者將.mp3關聯還原至 Litware 播放機,則 Litware 播放機的資訊會保持不變,且尚未被另一個應用程式覆寫。 如果預設子機碼是該資訊的唯一來源,就可能發生 (覆寫。)
當您將 ProgID 對應至副檔名或通訊協定時,應用程式可以對應一對一或一對多。 在 Contoso 範例中,ContosoHTML 指向單一 ProgID,以提供.htm、.html、.shtml、.xht 和 .xhtml 延伸模組的殼層execute 資訊。 因為每個通訊協定都有不同的 ProgID,所以當您使用通訊協定時,您會讓每個通訊協定有自己的執行字串。
當您的 MIME 類型可以在瀏覽器中內嵌檢視時,MIME 類型的 ProgID 必須包含 CLSID 子機碼,該子機碼會使用對應應用程式的 CLSID (CLSID) 。 此 CLSID 用於查閱 MIME 資料庫中儲存在HKEY_LOCAL_MACHINE\SOFTWARE\類別\MIME\資料庫\內容類型中的 CLSID。 如果您的 MIME 類型不是要內嵌在瀏覽器中檢視,則可以省略此步驟。
註冊子機碼和值描述
本節說明使用 預設程式註冊應用程式時所使用的個別登錄子機碼和值,如先前所述。
功能
Capabilities子機碼包含特定應用程式的所有預設程式資訊。 預留位置 %ApplicationCapabilityPath% 是指從 HKEY_CURRENT_USER 或 HKEY_LOCAL_MACHINE 到應用程式 Capabilities 子機碼的登錄路徑。 此子機碼包含下表所示的重要值。
值 | 類型 | 意義 |
---|---|---|
ApplicationDescription | REG_SZ或REG_EXPAND_SZ | 必要。 若要讓使用者做出明智的預設指派選擇,應用程式必須提供描述應用程式功能的字串。 雖然先前的 Contoso 範例會將描述直接指派給 ApplicationDescription 值,但應用程式通常會提供描述做為內嵌在.dll檔案中的資源,以利當地語系化。 如果未提供 ApplicationDescription,應用程式就不會出現在潛在預設程式的 UI 清單中。 |
ApplicationName | REG_SZ或REG_EXPAND_SZ | 選擇性。 程式出現在預設程式 UI 中的名稱。 如果應用程式未提供此資料,則會在 UI 中使用與應用程式第一個已註冊 ProgID 相關聯的可執行程式名稱。 ApplicationName 必須一律符合在 RegisteredApplications下註冊的名稱。 如果您想要不同的應用程式類型,例如瀏覽器和電子郵件用戶端,則可以使用 ApplicationName,以指向相同的可執行檔,同時顯示為不同的名稱。 |
Hidden | REG_DWORD | 選擇性。 將此值設定為 1,以隱藏 [ 設定預設程式 ] 對話方塊中程式清單中的應用程式。 如果此值為 0 或不存在,則應用程式通常會出現在清單中。 |
FileAssociations
FileAssociations子機碼包含應用程式所宣告的特定檔案關聯。 這些宣告會儲存為值,每個延伸模組都有一個值。 關聯指向應用程式特定的 ProgID,而不是泛型 ProgID。 不過,所有關聯都不需要指向相同的 ProgID。
MIMEAssociations
MIMEAssociations子機碼包含應用程式所宣告的特定 MIME 類型。 這些宣告會儲存為值,每個 MIME 類型都有一個值。 每個 MIME 類型的值名稱必須完全符合 MIME 資料庫中儲存的 MIME 名稱。 值也必須指派應用程式特定的 ProgID,其中包含應用程式的對應 CLSID。
Startmenu
Startmenu子機碼與 [開始] 功能表中的使用者可指派網際網路和電子郵件專案相關聯。 應用程式必須個別註冊為這些專案的競爭者。 如需詳細資訊,請參閱 使用用戶端類型註冊程式。
注意
從 Windows 7 開始,[開始] 功能表中不再有網際網路和電子郵件專案。 與 電子郵件 專案相關聯的登錄資料仍用於預設 MAPI 用戶端,但與 網際網路 專案相關聯的登錄資料完全不會由 Windows 使用。
藉由將應用程式的 [開始 ] 功能表註冊與其 [預設程式 ] 註冊產生關聯,應用程式就會在 [設定關聯 ] UI 中顯示為潛在的預設值。 如果使用者已選擇應用程式做為預設值,然後選擇稍後還原所有應用程式預設值,應用程式就會還原至該使用者的 [ 開始 ] 功能表位置。 如需詳細資訊和圖例,請參閱本主題稍後的預設 程式 UI 一節。
Startmenu子機碼有兩個專案:StartMenuInternet 和 Mail,對應至 [開始] 功能表中標準網際網路和電子郵件位置。 應用程式會指派 StartMenuInternet 或 Mail 值,其值等於HKEY_LOCAL_MACHINE\SOFTWARE\用戶端\StartMenuInternet底下的已註冊子機碼名稱,或HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail (,如使用用戶端類型註冊程式中所述) 。
在 [開始] 功能表中的電子郵件標準位置案例中,它代表預設的 MAPI 用戶端,因此會假設能夠處理 MAPI 呼叫。 在 Windows 7 下,雖然 [開始] 功能表中不再有電子郵件標準位置,但此子機碼會繼續用於預設 MAPI 用戶端。 宣告郵件預設值的應用程式應該會在下列子機碼下註冊為 MAPI 處理常式:
HKEY_LOCAL_MACHINE
SOFTWARE
Clients
Mail
CanonicalName
如果郵件用戶端無法支援 MAPI,但仍想要競爭 [開始 ] 功能表 電子郵件 標準位置,它可以在下列子機碼下註冊命令列:
HKEY_LOCAL_MACHINE
SOFTWARE
Clients
Mail
CanonicalName
shell
open
command
此外,在[HKEY_LOCAL_MACHINESOFTWARE\Clients\Mail\CanonicalName] \ 下,新增具有應用程式名稱的預設值。
這些專案允許從 [ 開始 ] 功能表的電子郵件位置 啟動應用程式。 請注意,MAPI 呼叫仍然對應用程式進行,而且會落到先前的 MAPI 處理常式,如果沒有設定 MAPI 處理常式,則失敗。 如需詳細資訊,請參閱 使用用戶端類型註冊程式。
UrlAssociations
UrlAssociations子機碼包含應用程式所宣告的特定 URL 通訊協定。 這些宣告會儲存為值,每個通訊協定都有一個值。 每個通訊協定都必須指向應用程式特定的 ProgID,而不是指向泛型 ProgID。 如 Contoso 範例所述,您可以針對每個通訊協定使用不同的 ProgID,讓每個通訊協定都有自己的執行字串。
RegisteredApplications
RegisteredApplications的完整子機碼為:
\ HKEY_LOCAL_MACHINE軟體\RegisteredApplications
此子機碼會為作業系統提供應用程式的 [預設程式 ] 資訊的登錄位置。 位置會儲存為值,其名稱必須符合應用程式的名稱。
完整註冊範例
此範例顯示用於註冊虛構 Litware 媒體播放機的子機碼和值。 此範例包含 ProgID 專案,以顯示它如何一起運作。
下列子機碼顯示.mp3 MIME 類型的應用程式特定 ProgID:
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
LitwarePlayer11.MIME.MP3
CLSID
(Default) = {CD3AFA76-B84F-48F0-9393-7EDC34128127}
接下來是將 Litware 程式與副檔名.mp3關聯的應用程式特定 ProgID。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
LitwarePlayer11.AssocFile.MP3
(Default) = MP3 Format Sound
DefaultIcon
(Default) = %ProgramFiles%\Litware\litware.dll, 0
shell
open
command
(Default) = %ProgramFiles%\Litware\litware.exe
下一個專案會顯示.mpeg MIME 類型和副檔名的合併 ProgID。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
LitwarePlayer11.AssocFile.MPG
(Default) = Movie Clip
CLSID
(Default) = {D92B76F4-CFA0-4b93-866B-7730FEB4CD7B}
DefaultIcon
(Default) = %ProgramFiles%\Litware\litware.dll, 0
shell
open
command
(Default) = %ProgramFiles%\Litware\litware.exe
下一個專案會在 預設程式中 註冊 Litware 程式,並使用先前註冊的 ProgID
HKEY_LOCAL_MACHINE
SOFTWARE
Litware
LitwarePlayer
Capabilities
ApplicationDescription = The new Litware Media Player breaks new ground in exciting fictional programs.
FileAssociations
.mp3 = LitwarePlayer11.AssocFile.MP3
.mpeg = LitwarePlayer11.AssocFile.MPG
MimeAssociations
audio/mp3 = LitwarePlayer11.MIME.MP3
audio/mpeg = LitwarePlayer11.AssocFile.MPG
最後,此範例會註冊 Litware 預設程式 註冊的位置。
HKEY_LOCAL_MACHINE
SOFTWARE
RegisteredApplications
Litware Player = Software\Litware\LitwarePlayer\Capabilities
成為預設瀏覽器
瀏覽器註冊必須遵循本主題中所述的最佳做法。 安裝瀏覽器時,Windows 可以向使用者顯示系統通知,讓使用者可以選取瀏覽器作為系統預設值。 符合下列條件時會顯示此通知:
- 瀏覽器的安裝程式會使用SHCNE_ASSOCCHANGED旗標呼叫SHChangeNotify,告知 Windows 已註冊新的通訊協定處理常式。
- Windows 偵測到一或多個新應用程式已註冊來處理 HTTP:// 和 HTTPs:// 通訊協定,而且使用者尚未收到通知。 換句話說,使用者不會顯示下列任何專案:系統通知會公告應用程式、包含應用程式的 OpenWith 飛出視窗,或應用程式的 [設定使用者預設值] (SUD) 主控台 頁面。
下列範例顯示瀏覽器安裝程式在寫入其登錄機碼之後應該執行的建議註冊程式碼。
SHChangeNotify 會先通知系統有新的關聯選項可供使用。 需要 SHChangeNotify呼叫,以確保系統預設值正常運作。
然後 ,睡眠 語句可讓系統進程處理通知的時間。
void NotifySystemOfNewRegistration()
{
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_DWORD | SHCNF_FLUSH, nullptr, nullptr);
Sleep(1000);
}
如果使用者關閉或忽略產生的通知或飛出視窗,而不選取新的預設瀏覽器,則預設瀏覽器會保持不變。 請注意,使用者也可以透過其他機制隨時變更預設瀏覽器,包括在主控台中設定使用者預設值。
預設程式 UI
本節中的圖例會顯示使用者所看到的 預設程式的 UI。
下圖顯示主控台中的主要[預設程式] 視窗。
當使用者選擇 [ 設定預設程式 ] 選項時,會出現下列視窗。 使用者可以使用此頁面,為程式可能是預設值的所有檔案類型和通訊協定指派預設程式。 如下圖所示,所有 已註冊 的程式和程式圖示都會出現在左側的 [ 程式 ] 方塊中。
當使用者從清單中選取程式時,會顯示程式圖示和提供者。 如果 URL 內嵌在程式的數位簽署憑證中,程式也可以顯示 URL。 未數位簽署的程式無法顯示 URL。
程式在註冊期間提供的描述性文字也會顯示。 這是必要文字。 在描述方塊下方,表示程式目前已指派多少預設值,而其註冊要處理的完整號碼。
若要指派或還原程式做為其註冊之所有檔案和通訊協定的預設值,使用者按一下 [ 將此程式設定為預設 ] 選項。
若要將個別檔案類型和通訊協定指派給程式,使用者按一下 此程式選項的 [選擇預設值 ] 選項,以顯示程式視窗的 [設定關聯 ],如下圖所示。
注意
建議您使用IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI呼叫程式的設定關聯。
使用預設程式的最佳做法
本節提供您在註冊應用程式時使用 預設程式的 最佳做法指導方針。 它也提供建立應用程式的設計建議,為使用者提供最佳的 預設程式 功能。
安裝期間
除了一般在 Windows XP 下練習的安裝程式之外,Windows Vista 或更新版本的應用程式還必須向 預設程式 功能註冊,才能利用其功能。
在安裝期間執行下列步驟順序。 步驟 1-3 符合 Windows XP 中使用的步驟;步驟 4 是 Windows Vista 的新功能。
- 安裝必要的二進位檔案。
- 將 ProgID 寫入HKEY_LOCAL_MACHINE。 請注意,應用程式必須為其關聯建立應用程式特定的 ProgID。
- 使用 預設程式 註冊應用程式,如註冊應用程式 以搭配預設程式中所述。
安裝之後
本節討論應用程式提示應該如何先向使用者呈現其預設選項。 它也會討論應用程式如何監視其狀態,作為其可能關聯和通訊協定的預設值。
初次執行體驗
第一次由使用者執行應用程式時,建議應用程式向使用者顯示 UI,且通常包含這兩個選項:
- 接受預設的應用程式設定。 預設會選取此選項。
- 自訂預設應用程式設定。
在Windows 8之前,如果使用者接受預設設定,您的應用程式會呼叫IApplicationAssociationRegistration::SetAppAsDefaultAll,這會將安裝期間宣告的所有機器層級關聯轉換為該使用者的個別使用者設定。
如果使用者決定自訂設定,您的應用程式會呼叫 IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI 來顯示檔案關聯 UI。 下圖顯示虛構 Litware 媒體播放機的這個視窗。
檔案關聯視窗會顯示應用程式註冊的預設值,也會顯示其他延伸模組和通訊協定的目前預設值。 使用者完成自訂預設值之後,他們會按一下 [ 儲存 ] 按鈕來認可變更。 如果使用者按一下 [ 取消],視窗會關閉而不儲存變更。
您應該將此 UI 用於您的應用程式,而不是建立自己的 UI。 如此一來,您就會儲存先前開發檔案關聯 UI 所需的資源。 您也保證已正確儲存關聯。
設定應用程式以檢查它是否為預設值
注意
自Windows 8起,不再支援此功能。
應用程式通常會檢查它們是否在執行時設定為預設值。 呼叫 IApplicationAssociationRegistration::QueryAppIsDefault 或 IApplicationAssociationRegistration::QueryAppIsDefaultAll,設定您的應用程式以進行這項檢查。
如果應用程式判斷它不是預設值,它可以呈現 UI,詢問使用者是否接受目前的情況,或讓應用程式成為預設值。 一律在此 UI 中包含預設選取的核取方塊,並顯示不需再次詢問的選項。
注意
預設的選擇應該是使用者驅動。 應用程式不應該在要求使用者的情況下回收預設值。
下圖顯示範例對話方塊。
其他資源
相關主題