共用方式為


管理預設應用程式

設定程式存取和電腦預設值 (SPAD) 功能已新增至 Windows XP 和更新版本的 Windows,以管理每部電腦預設值。 除了 SPAD 之外,Windows Vista 還引進了每個使用者預設應用程式的概念,以及 主控台 中的[預設程式] 專案。

重要

本主題不適用於Windows 10。 預設檔案關聯在 Windows 10 中運作的方式。 如需詳細資訊,請參閱本文Windows 10如何處理預設應用程式的變更一節。

 

個別使用者預設設定是系統上個別使用者帳戶專屬的。 如果每個使用者的預設設定存在,則會優先于該帳戶的對應每部電腦預設值。 從Windows 8起,檔案類型和通訊協定預設值的擴充性系統嚴格是每個使用者,而且會忽略每部電腦預設值。 SPAD 也會在 Windows 8 中變更,以設定每個使用者的預設值。

  • 在執行舊版 Windows Windows 8 的系統上,新建立的使用者帳戶會收到每部電腦預設值,直到建立每個使用者預設值為止。 在 Windows Vista 和更新版本中,使用者可以使用主控台中的[預設程式] 專案來設定或變更其每個使用者的預設值。 此外,第一次執行應用程式時,可以使用 應用程式初次執行和預設值 一節中的指導方針來設定每個使用者的預設值。
  • 在執行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) 使用用戶端類型註冊程式。 後續各節將討論特定變更和新的建議。

在 SPAD 中設定預設值

每個使用者預設值會覆寫每部電腦預設值。

  • 在Windows 8之前:如果已設定對應的個別使用者預設值,則會在 SPAD (中設定預設值時,不會看到每部電腦) 的預設值。 如果使用者尚未設定每個使用者的預設值,則系統會使用對應的電腦預設值。 電腦上的新使用者帳戶一開始會繼承電腦預設值。 使用者第一次執行應用程式時,應用程式應該提示使用者指派每個使用者的預設值。 請參閱 應用程式初次執行和預設值
  • 從Windows 8起:所有預設值都是每個使用者,而且會忽略任何每部電腦的預設設定。 應用程式無法再設定預設選項,因此無法引導使用者完成指派這些預設值。

當預先Windows 8應用程式在 SPAD 中實作設定為預設值時,應該遵循下列指導方針:

  • 應用程式應該只宣告透過 SPAD 的電腦層級預設值。
  • 應用程式 不應該 透過 SPAD 宣告每個使用者的預設值。

當Windows 8應用程式在 SPAD 中實作Set as Default時,他們必須使用 SPAD 中使用的相同應用程式名稱,在預設程式中註冊其檔案類型和通訊協定。 這可讓 SPAD 中的變更反映為目前使用者對應的預設程式專案變更。

隱藏 SPAD 中的存取

SPAD 中每個可能預設值的隱藏存取選項是以下列兩種方式之一存取:

  • 選擇 [非 Microsoft ] 的預設值類別,這會移除所有 Microsoft 預設值的存取權。
  • 選擇 [ 自訂 ] 類別,然後清除 [ 啟用此程式的存取 權] 核取方塊。

先前,採取其中一個動作會移除系統上適當應用程式的所有進入點。 此情況的特定指導方針假設從下列位置移除快捷方式和圖示:

  • 桌面
  • 開始功能表
  • (Windows Vista 和更早版本的快速啟動列)
  • [通知] 區域
  • 快顯功能表
  • 資料夾工作範圍

建議廠商在應用程式的隱藏存取回呼函式中實作這些指導方針。

SPAD 中的替代隱藏存取方法

對於某些繼承應用程式,隱藏存取的完整實作可能並不實用。 可達到相同效果但使用者無法輕易回復的替代方法是卸載應用程式。 以下顯示實作此動作的範例行為和範例程式碼。

此替代方案的建議使用者體驗如下:

  • 當使用者清除 SPAD 中 [ 啟用此程式存取 ] 方塊時,會顯示下列 UI。

    關於隱藏程式存取權的 vista 對話方塊

  • 當使用者按一下 [確定] 時,會顯示主控台中的[程式和功能] 專案,讓使用者可以卸載應用程式。

  • Windows XP 使用者應該會顯示下列對話方塊。

    有關隱藏程式存取權的 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 \[開始 \] 功能表也會在程式清單之外顯示兩個專用連結,以 Canonically 標題為 網際網路電子郵件。 應用程式註冊這些類別之後,預設程式架構可以管理透過這些連結啟動的專案。

注意

從 Windows 7 開始, 網際網路電子郵件 專用的 \[開始 \] 功能表連結將不再顯示。

 

為了進一步提高可探索性,應用程式也可以將快捷方式新增至桌面和快速啟動列。 應用程式應該要求使用者在安裝期間或在初次執行) 期間要求使用者取得許可權 (,再將圖示新增至 [ 開始 ] 功能表、桌面或 [快速啟動] 列。

注意

自 Windows 7 起,[快速啟動] 列已不再提供。 Windows 7 替代方法是將應用程式釘選到工作列,但無法以程式設計方式進行釘選,因為它絕對是使用者選擇。

 

如需詳細資訊,請參閱下列主題:

應用程式安裝和預設值

由於 Windows XP 之後,應用程式安裝程式基本上尚未變更,但執行 Windows 版本比 Windows 8 還舊之系統的新指導方針除外:在安裝時間採用每部電腦預設值,但除非該使用者第一次執行應用程式,否則不會設定任何每個使用者的預設值。 (請參閱 應用程式初次執行和 Defaults.) 應用程式不應該在安裝期間設定每個使用者的預設值,因為安裝應用程式的人員不是預期的使用者。 從Windows 8起,不支援每部電腦預設值,而且應用程式無法變更每個使用者的預設設定。

在安裝期間,應用程式應該將其二進位檔複製到硬碟,並將其 ProgID 寫入登錄。 應用程式也應該針對每個檔案關聯註冊預設程式和 Open With ,這是要處理的候選項目。 應用程式可以使用 OpenWithProgIds 子機碼向 Open With註冊。

如需詳細資訊,請參閱下列主題:

應用程式升級和預設值

許多應用程式都能夠隨著時間自行升級。 此升級程式不應該變更每個使用者預設值的狀態,因為該變更對使用者不會預期。 不過,應用程式可以接受檢查電腦層級的檔案關聯,並在它們已損毀時加以修復。

應用程式初次執行和預設值

注意

從Windows 8開始,系統會代表所有應用程式處理此程式。 應用程式本身無法再查詢和變更預設值。 只有使用者可以這麼做。 因此,應用程式不應該嘗試查詢目前的預設值,或透過任何機制變更該預設值。 不過,應用程式可以呼叫IApplicationAssociationRegistrationUI介面的LaunchAdvancedAssociationUI方法,在主控台中提供預設程式的進入點。

 

在 Windows Vista 中引進每位使用者預設值時,請務必讓應用程式爭用熱門副檔名,以提供一般使用者體驗來宣告這些延伸模組。 由於這些預設值現在設定在使用者的內容中,因此只有在使用者安裝之後執行程式時,才應該將其呈現為預設可能性。

建立每個使用者預設值的指導方針如下:當應用程式第一次針對特定使用者執行時,該應用程式應該要求本身之預設值和檔案關聯的使用者喜好設定。

建議的 UI 應該為使用者提供兩個清楚的選擇:

  1. 接受應用程式想要宣告的所有預設值。 此選項也可能設定應用程式的其他預設屬性,例如隱私權或自動更新設定。 此選項可讓應用程式宣告其所有已註冊的預設值。
  2. 藉由個別接受或不接受預設選取專案和程式設定來自訂。 此選項提供進一步的 UI,可讓使用者針對其預設選項做出細微的選擇。

如需詳細資訊,請參閱 預設程式

注意

自 Windows 8 起,不支援此功能。

 

在應用程式向 Windows Vista 和更新版本中的預設程式註冊之後,特定 API 就會可供應用程式使用。 例如,應用程式可能需要檢查它是否為預設程式。 IApplicationAssociationRegistration介面提供執行此動作的方法。

任何想要宣告預設值的應用程式都必須先詢問使用者,且絕不會宣告預設,而不需要許可權。 應該詢問使用者是否要讓應用程式成為預設值,或保留目前的預設值。 在使用者選擇之後,也應該有一個選項不要再次詢問這個問題。

如需詳細資訊,請參閱 預設程式

應用程式相容性秘訣

本節提供一些與 Windows 中預設程式體驗相關的應用程式相容性秘訣。

避免觸發Per-User虛擬化

使用使用者帳戶控制 (UAC) 環境,應用程式應該一律只以標準使用者權限執行,以獲得最佳客戶體驗。 基於安全性考慮,具有標準使用者許可權等級的應用程式會遭到封鎖,而無法寫入登錄的特定部分和特定系統檔案。 Windows Vista 和更新版本的 Windows 提供暫時的應用程式相容性 (AppCompat) 層,以協助應用程式進行轉換。 封鎖寫入登錄或系統檔案的嘗試會「虛擬化」,讓應用程式繼續執行,但不會改變系統的敏感性區域。 不過,應用程式不應該依賴 AppCompat 技術作為長期解決方案。 相反地,應用程式應該使用許多可用的工具來確認他們可以在標準使用者權限下順利執行。 可能需要重新程式設計應用程式才能完成這項作業,但應該為了長期相容性而完成。

避免來自程式相容性小幫手的 AppCompat 警告或區塊

Windows Vista 和更新版本提供 PCA (PCA) 的程式相容性小幫手。 其用途是提供自動化方法,讓具有相容性問題的較舊程式運作更好。 PCA 會監視程式是否有已知問題。 如果偵測到問題,它會通知使用者問題,並提供在使用者再次執行程式之前套用有效的解決方案。 為了避免看到這些警告或區塊,ISV 應該使用許多可用的工具來確保其應用程式與 Windows Vista、Windows 7 和更新版本相容。

支援舊版 Windows 作業系統

Windows Vista 之前,任何 Windows 作業系統都無法使用預設程式基礎結構。 因此,當應用程式移至新的預設程式基礎結構時,應該保留其較舊的應用程式預設值程式碼,以維持與舊版 Windows 的相容性。 應用程式應該在其安裝過程中執行作業系統版本檢查,以判斷要執行的應用程式預設程式碼。

若要支援從 Windows XP 升級至 Windows Vista 或更新版本,應用程式應該新增預設程式所需的所有登錄專案,即使它們安裝在執行 Windows XP 的電腦上也一樣。 註冊不會影響執行 Windows XP 的電腦上,但如果電腦稍後升級,應用程式將會已註冊,而且能夠利用架構。

如需詳細資訊,請參閱 OSVERSIONINFO

其他資源

檔案關聯的最佳作法

檔案關聯範例案例

預設程式

使用設定程式存取和電腦預設值 (SPAD)