管理預設應用程式
Set Program Access and Computer Defaults (SPAD) 功能已新增至 Windows XP 和更新版本的 Windows,以管理每部計算機預設值。 除了 SPAD 之外,Windows Vista 還介紹了每個使用者預設應用程式的概念,以及控制面板中 預設程式 專案。
重要
本主題不適用於 Windows 10。 默認檔案關聯在 Windows 10 中運作的方式有所變更。 如需詳細資訊,請參閱 本文中的 Windows 10 如何處理預設應用程式變更 的一節。
個別用戶的預設設定是系統上個別用戶帳戶專屬的。 如果有個別使用者的預設設定,將優先於該帳戶中每台計算機的預設值。 從 Windows 8 起,檔案類型和通訊協定預設值的擴充性系統僅限於每個使用者,且會忽略每台電腦的預設值。 SPAD 也會在 Windows 8 中變更為設定每個用戶預設值。
- 在執行 Windows 8 之前版本的 Windows 系統上,新創建的用戶帳戶會先接受針對每台電腦的預設設定,直到完成針對每個用戶的預設設定為止。 在 Windows Vista 和更新版本中,使用者可以使用 [控制面板] 中的 [預設程式] 項目來設定或變更其每個使用者的預設值。 此外,第一次執行應用程式時,可以使用 Application First Run 和 Defaults 一節中遵循的指導方針來設定每個用戶預設值。
- 在執行 Windows 8 的系統上,新建立的使用者帳戶會從初始便依賴各自的使用者預設值,而不再支援在 「應用程式第一次執行和預設值」 一節中所述的那些預設值設定。
應用程式必須向 SPAD 和預設程式功能註冊,才能在 Windows Vista 和更新版本中以預設程式的形式提供。
本主題提供獨立軟體廠商 (ISV) 的快速指南,說明在 Windows Vista 和更新版本中註冊及管理應用程式預設值所需的步驟。 每個章節主題的相關深入文章會提供連結。
- 在控制面板 中 預設程序項目
- 設定程式存取和計算機預設值
-
註冊應用程式進入點
- 使用 開啟
- 開始選單和快速啟動欄
- 應用程式安裝和預設值
- 應用程式升級和預設值
- 應用程式初次執行和預設值
- 驗證預設值並要求使用者同意
- 應用程式相容性秘訣
- 其他資源
- 相關主題
控制面板中的預設程序專案
預設程式 是 Windows Vista 中引進的功能,可直接從 [開始] 功能表和 [控制面板] 存取。 它提供新的基礎結構,可與標準用戶許可權搭配運作(未提高),其設計目的是讓使用者和應用程式能夠管理每個使用者的預設值。 針對使用者,預設程式提供統一且易於存取的方式,可管理系統上所有應用程式的預設值、檔案關聯和自動執行設定。 針對應用程式,使用預設程式 API 所提供的每個使用者範圍可提供下列優點:
無高度
應用程式不需要提升其權限以使用預設值。
良好的公民身份
在多用戶計算機上,每個使用者都可以選取不同的默認應用程式。
預設管理
默認程式 API 提供可靠且一致的機制,可讓您自行檢查默認狀態並回收遺失的設定,而不需直接寫入登錄。 不過,從 Windows 8 開始,我們不建議應用程式查詢默認狀態,因為應用程式無法再變更預設設定,這些變更只能由用戶進行。
若要讓應用程式有效地管理預設值,您必須將應用程式註冊為潛在的預設程式。 如需註冊和使用預設程式 API 的詳細資訊,請參閱 預設程式。
預設程式也提供這兩個功能:
可重複使用的預設UI
在程序預設值(設定預設程式)和檔案關聯(關聯檔類型或通訊協定與程式)中,UI 可以被應用程式重複使用並呼叫。 這可讓應用程式提供管理預設值的標準使用者體驗,並免除ISV開發自訂或等效UI的麻煩。
包含 URL 和行銷資訊
在 [控制面板] 的 [預設程式] 項目中,於其 設定預設程式 頁面,應用程式可以提供行銷資訊及廠商網站連結。 此 URL 衍生自應用程式已簽署的 Authenticode 憑證。 這可防止誤用並未經授權取代此連結。 如果應用程式具有包含內嵌 URL 的 Authenticode 憑證,Windows UI 會顯示該內嵌 URL。 ISV 應利用這項功能,將使用者導向其網站進行更新和其他下載。
設定程式存取和計算機預設值
設定程式存取和計算機預設值 (SPAD) 可讓系統管理員管理該電腦所有新使用者繼承的計算機範圍預設值。 在 Windows 8 之前,SPAD 也會讓系統管理員修復檔案關聯,如果程式從系統移除時,檔案關聯就會中斷。 不過,從 Windows 8 起,SPAD 只會影響使用者特定的預設值。
如需在 SPAD 中註冊應用程式的詳細資訊,請參閱 設定程式存取及電腦預設值 和 與客戶類型註冊程式。 後續各節將討論特定變更和新的建議。
在 SPAD 中設定預設值
每位使用者的預設值會取代每部電腦的預設值。
- 在 Windows 8 之前:如果已設定對應的每個用戶預設值,則使用者將不會看到在 SPAD 中每台計算機設定的預設值。 如果使用者未設定每個用戶預設值,系統就會使用對應的計算機預設值。 計算機上的新用戶帳戶一開始會繼承計算機預設值。 使用者第一次執行應用程式時,應用程式應該會提示使用者指派其每個用戶預設值。 請參閱 應用程式初次執行和預設值。
- Windows 8:所有預設值都是每個使用者,而且會忽略每部計算機的任何預設設定。 應用程式無法再設定預設選項,因此無法引導使用者完成指派這些預設值。
當 Windows 8 前應用程式在 SPAD 中實作 設定為預設 時,應該遵循下列指導方針:
- 應用程式應該只透過 SPAD 宣告電腦層級預設值。
- 應用程式應該 不要透過 SPAD 每個使用者的宣告預設值。
當 Windows 8 應用程式在 SPAD 中實作 設定為預設 時,必須使用 SPAD 中使用的相同應用程式名稱,在 預設程式中註冊其檔類型和通訊協定。 這可讓 SPAD 中的變更反映為目前使用者的對應預設程式項目變更。
隱藏 SPAD 中的存取
SPAD 中每個可能預設值的隱藏存取選項會以下列兩種方式之一存取:
- 選擇 非Microsoft 的預設類別,從而移除對所有Microsoft的預設設定的存取。
- 選擇 自定義 類別,然後清除 啟用此程式的存取 複選框。
先前,採取上述任一動作會移除系統上適當應用程式的所有進入點。 此情況的特定指導方針說明如何從下列位置移除快捷方式和圖示:
- 桌面
- [開始] 功能表
- 快速啟動列 (僅限 Windows Vista 和更早版本)
- 通知區域
- 捷徑選單
- 資料夾工作帶
建議廠商在應用程式的 Hide Access 回呼函式中實作這些指導方針。
SPAD 中的替代隱藏存取方法
對於某些舊版應用程式,隱藏存取的完整實作可能並不實用。 可達到相同效果但不容易由使用者反轉的替代方法,就是卸載應用程式。 以下顯示實作此動作的范例行為和範例程序代碼。
此替代方式的建議用戶體驗如下:
當使用者在 SPAD 中清除 [啟用此程式的存取權] 方塊時,會顯示下列 UI。
的存取權
當使用者按兩下 [確定] [確定]時,會顯示 [控制面板] 中的 [程式和功能] 專案,讓使用者可以卸載應用程式。
Windows XP 使用者應該會顯示下列對話方塊。
的存取權
當 Windows XP 使用者點擊 [確定]時,會顯示 [控制面板] 中的 [新增或移除程式] 專案,讓使用者可以移除應用程式。
下列程式代碼提供隱藏存取功能的可重複使用實作,如先前所述。 它可以在 Windows XP、Windows Vista 和 Windows 7 上使用。
#include <windows.h>
#include <shlwapi.h>
#include <strsafe.h>
PCWSTR c_pszMessage1 = L"To hide access to this program, you need to uninstall it by ";
PCWSTR c_pszMessage2 = L"using\n%s in Control Panel.\n\nWould you like to start %s?";
PCWSTR c_pszApplicationName = L"Sample App";
int _tmain(int argc, WCHAR* argv[])
{
OSVERSIONINFO version;
version.dwOSVersionInfoSize = sizeof(version);
if (GetVersionEx(&version))
{
PCWSTR pszCPLName = NULL;
if (version.dwMajorVersion >= 6)
{
// Windows Vista and later
pszCPLName = L"Programs and Features";
}
else if (version.dwMajorVersion == 5 &&
version.dwMinorVersion == 1)
{
// XP
pszCPLName = L"Add/Remove Programs";
}
if (pszCPLName != NULL)
{
WCHAR szMessage[256], szScratch[256];
if (SUCCEEDED(StringCchPrintf(szScratch,
ARRAYSIZE(szScratch),
c_pszMessage2,
pszCPLName,
pszCPLName)))
{
if (SUCCEEDED(StringCchCopy(szMessage,
ARRAYSIZE(szMessage),
c_pszMessage1)))
{
if (SUCCEEDED(StringCchCat(szMessage,
ARRAYSIZE(szMessage),
szScratch)))
{
if (IDOK == MessageBox(NULL,
szMessage,
c_pszApplicationName,
MB_OKCANCEL))
{
ShellExecute(NULL,
NULL,
L"appwiz.cpl",
NULL,
NULL,
SW_SHOWNORMAL);
}
}
}
}
}
}
return 0;
}
註冊應用程式入口點
應用程式可以在作業系統中有許多進入點。 以下是進入點的建議位置:
- 桌面
- [開始] 功能表
- 快速啟動列 (僅限 Windows Vista 和更早版本)
- 通知區域
- 快捷選單
- 資料夾任務列
本節著重於這些特定區域:
- 使用 開啟
- [開始] 功能表和快速啟動列
使用...開啟
[開啟方式] 快捷方式功能表可讓使用者選取可處理特定檔案類型的應用程式。 雖然 Open With 可用來開啟應用程式一次的檔案,但它也可以用來設定該擴展名的預設值。 因此,應用程式應該一律註冊 Open With,讓使用者會看到該應用程式做為選擇。 應用程式可以註冊 Open With的檔類型和通訊協定。 在預設程式架構中註冊通訊協定的應用程式會自動被添加到通訊協定的 Open With 選項中。
如需註冊 Open With的相關信息,請參閱 檔案關聯簡介。
開始功能表和快速啟動列
若要讓使用者更容易探索,應用程式可以將快捷方式新增至 Windows 中的各種位置。 新增快捷方式最常見的位置是 [開始] 功能表。 在 Windows Vista 和更新版本中,應用程式會在隱藏資料夾中建立快捷方式,%ProgramData%\Microsoft\Windows\Start Menu\Programs,以顯示在所有使用者的 [開始] 功能表程序清單中。 通常,應用程式會新增包含快捷方式的子資料夾。
針對瀏覽器和電子郵件程式,Windows Vista [開始] 功能表也會在程式清單之外提供兩個專用連結,標準命名為 網際網路 和 電子郵件。 應用程式註冊這些類別之後,預設程式架構可以管理透過這些鏈接啟動的專案。
注意
自 Windows 7 起,因特網 和 電子郵件 專用 \[開始\] 功能表連結不再顯示。
為了進一步提高可探索性,應用程式也可以將快捷方式新增至桌面和快速啟動列。 應用程式應該要求使用者取得許可權(通常是在安裝期間或在初次執行期間),再將圖示新增至 [開始] 功能表、桌面或快速啟動列。
注意
從 Windows 7 開始,[快速啟動] 列已不再提供。 Windows 7 的替代方案是將應用程式釘選到任務列,但無法以程式設計方式釘選,因為它絕對是用戶選擇。
如需詳細資訊,請參閱下列主題:
應用程式安裝和預設值
自 Windows XP 以來,應用程式安裝程序基本未改變,但針對版本早於 Windows 8 的系統新增了一項指導方針:在安裝時採用電腦預設值,但在該使用者第一次執行應用程式之前,不設置任何使用者預設值。 (請參閱 應用程式初次執行和預設值。應用程式不應該在安裝期間設定每個使用者的預設值,因為在某些情況下,安裝應用程式的人員不是預期的使用者。 從 Windows 8 起,不支援每部電腦預設值,而且應用程式無法變更每個使用者的預設設定。
在安裝期間,應用程式應該將其二進位檔複製到硬碟,並將其 ProgID 寫入登錄。 應用程式應在此時註冊為預設程式以及Open With,並確保它可以處理的每個檔案關聯都得到註冊。 應用程式可以使用 OpenWithProgIds 子機碼向 Open With進行註冊。
如需詳細資訊,請參閱下列主題:
應用程式升級和預設值
許多應用程式都能夠隨著時間自行升級。 此升級程式不應變更每個用戶預設值的狀態,因為該變更對使用者不會預期。 然而,應用程式可以檢查電腦層級的檔案關聯,如果它們已損毀,可以進行修復。
應用程式初次執行和預設值
注意
從 Windows 8 開始,系統會代表所有應用程式處理此程式。 應用程式本身無法再查詢和變更預設值。 只有用戶可以這麼做。 因此,應用程式不應該嘗試查詢目前的預設值,或透過任何機制變更該預設值。 不過,應用程式可以藉由呼叫 IApplicationAssociationRegistrationUI 介面的 LaunchAdvancedAssociationUI 方法,在控制面板中提供預設程式的進入點。
在 Windows Vista 引入使用者特定預設值時,競爭熱門副檔名的應用程式必須提供一致性用戶體驗以聲明對這些副檔名的支援。 因為這些預設值現在會在使用者的內容中設定,所以只有在使用者安裝之後執行程式時,才會將自己呈現為預設的可能性。
建立每個用戶預設值的指導方針如下:當應用程式第一次針對特定使用者執行時,該應用程式應該要求使用者對預設值和檔案關聯本身的喜好設定。
建議的UI應該為使用者提供兩個清楚的選擇:
- 接受應用程式想要宣告的所有預設值。 此選項也可能設定應用程式的其他預設屬性,例如隱私權或自動更新設定。 這個選項可讓應用程式宣告其所有已註冊的預設值。
- 透過個別接受或拒絕預設選項和程式設定來進行自定義。 此選項提供進一步的UI,可讓使用者針對其預設選項做出細微的選擇。
如需詳細資訊,請參閱 預設程式。
驗證預設值並要求使用者同意
注意
從 Windows 8 起,不支援此設定。
在 Windows Vista 和更新版本中,應用程式向預設程式註冊之後,某些 API 便可供應用程式使用。 例如,應用程式可能需要檢查它是否為預設程式。 IApplicationAssociationRegistration 介面會提供執行此操作的方法。
任何想要宣告預設值的應用程式都必須先詢問使用者,且絕對不要在沒有許可權的情況下宣告預設值。 應該詢問使用者是否要讓應用程式成為預設值,或保留目前的預設值。 在使用者做出選擇之後,也應該有一個選項不要再問這個問題。
如需詳細資訊,請參閱 預設程式。
應用程式相容性秘訣
本節提供一些與 Windows 中預設程式體驗相關的應用程式相容性秘訣。
避免觸發 Per-User 虛擬化
透過用戶帳戶控制 (UAC) 環境,應用程式應該一律只以標準使用者權力執行,以獲得最佳客戶體驗。 基於安全性考慮,具有標準使用者許可權等級的應用程式會遭到封鎖,無法寫入登錄的特定部分和特定系統檔案。 Windows Vista 和更新版本的 Windows 提供暫時的應用程式相容性 (AppCompat) 層,以協助應用程式進行轉換。 封鎖寫入登錄或系統檔案的嘗試會「虛擬化」,讓應用程式繼續執行,但不會改變系統的敏感區域。 不過,應用程式不應依賴AppCompat技術作為長期解決方案。 相反地,應用程式應該使用許多可用的工具來確認它們可以在標準用戶權力下順利執行。 可能需要重新程式化應用程式才能完成這項作業,但應該為了長期相容性而完成。
避免由程式相容性助理發出的 AppCompat 警告或封鎖
Program Compatibility Assistant (PCA) 會在 Windows Vista 和更新版本中提供。 其用途是提供自動化方法,讓具有相容性問題的較舊程序運作得更好。 PCA 會監控程序,查看是否有已知問題。 如果偵測到問題,它會通知用戶問題,並提供在使用者再次執行程式之前套用有效的解決方案。 為了避免看到這些警告或區塊,ISV 應該使用許多可用的工具來確保其應用程式與 Windows Vista、Windows 7 和更新版本相容。
支援舊版 Windows 作業系統版本
在 Windows Vista 之前,任何 Windows作系統上都無法使用預設程式基礎結構。 因此,當應用程式移至新的預設程式基礎結構時,它們應該保留其較舊的應用程式默認程序代碼,以維持與舊版 Windows 的相容性。 應用程式應該在其安裝期間執行作系統版本檢查,以判斷要執行的應用程式預設程序代碼。
若要支援從 Windows XP 升級至 Windows Vista 或更新版本,應用程式應該新增預設程式所需的所有登錄專案,即使它們在執行 Windows XP 的電腦上安裝也一樣。 註冊不會影響執行 Windows XP 的電腦,但如果電腦稍後升級,應用程式將會註冊並能夠利用架構。
如需詳細資訊,請參閱 OSVERSIONINFO。
其他資源
相關主題