共用方式為


應用程式註冊

本主題討論應用程式如何公開啟用特定案例所需本身的相關信息。 這包括尋找應用程式所需的資訊、應用程式支援的動詞,以及應用程式可以處理的檔案類型。

本主題的組織方式如下:

注意

應用程式也可以在 [設定程式存取] 和 [計算機預設值] 和 [設定預設程式] (SYDP) 控制面板應用程式中註冊。 如需 SPAD 和 SYDP 應用程式註冊的相關信息,請參閱 檔案關聯和預設程式的指導方針,以及 設定程式存取和電腦預設值 (SPAD)

尋找應用程式可執行檔

ShellExecuteEx 函式以其 lpFile 參數中的可執行檔名稱呼叫時,函式會尋找檔案有幾個位置。 建議您在 應用程式路徑 登錄子機碼中註冊您的應用程式。 這樣做可避免應用程式需要修改系統PATH環境變數。

檔案會在下列位置中搜尋:

  • 目前的工作目錄。
  • 僅限 Windows 目錄(未搜尋子目錄)。
  • Windows\System32 目錄。
  • PATH 環境變數中列出的目錄。
  • 建議:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\應用程式路徑

註冊應用程式

應用程式路徑應用程式 登錄子機碼都用來代表應用程式註冊和控制系統的行為。 應用程式路徑 子機碼是慣用的位置。

使用應用程式路徑子機碼

在 Windows 7 和更新版本中,強烈建議您安裝每個使用者的應用程式,而不是每部電腦。 針對每個使用者安裝的應用程式可以在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\應用程式路徑下註冊。 針對計算機所有使用者安裝的應用程式,可以在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\應用程式路徑下註冊。

應用程式路徑 下找到的專案主要用於下列用途:

  • 將應用程式的可執行檔名稱對應至該檔案的完整路徑。
  • 若要在個別應用程式上預先將資訊預先寫到PATH環境變數,請根據每個進程。

如果 應用程式路徑的子機碼名稱 符合檔名,Shell 會執行兩個動作:

  • [預設] 項目會當做檔案的完整路徑使用。
  • 該子機碼的Path專案會預先寫入該程式的PATH環境變數。 如果不需要,則可以省略Path值。

可能要注意的問題包括:

  • Shell 會將命令行的長度限制為 MAX_PATH * 2 個字元。 如果列出許多檔案做為登錄專案或其路徑很長,清單稍後的檔名可能會因為命令行遭到截斷而遺失。
  • 某些應用程式不接受命令行中的多個檔名。
  • 某些接受多個檔名的應用程式無法辨識 Shell 提供它們的格式。 Shell 提供參數清單做為引號字串,但某些應用程式可能需要不含引號的字串。
  • 並非所有可拖曳的專案都是文件系統的一部分;例如,印表機。 這些項目沒有標準的 Win32 路徑,因此無法提供有意義的 lpParameters 值,ShellExecuteExecuteEx

使用DropTarget專案可藉由提供所有剪貼簿格式的存取權來避免這些潛在問題,包括 CFSTR_SHELLIDLIST(適用於長檔案清單)和 CFSTR_FILECONTENTS(適用於非文件系統物件)。

若要向應用程式路徑子機碼註冊及控制應用程式的行為:

  1. 將與可執行檔同名的子機碼新增至 應用程式路徑 子機碼,如下列登錄專案所示。

    HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
       SOFTWARE
          Microsoft
             Windows
                CurrentVersion
                   App Paths
                      file.exe
                         (Default)
                         DontUseDesktopChangeRouter
                         DropTarget
                         Path
                         UseUrl
    
  2. 如需 應用程式路徑 子機碼專案的詳細數據,請參閱下表。

登錄專案
(預設值) 這是應用程式的完整路徑。 在 (Default) 專案中提供的應用程式名稱,可以使用或不使用其 .exe 擴展名來表示。 如有必要,ShellExecuteEx 函式會在搜尋 應用程式路徑 子機碼時新增延伸模組。 專案是 REG_SZ 類型。
DontUseDesktopChangeRouter 調試程式應用程式在偵錯 Windows 檔案總管程式時,必須避免檔案對話框死結。 不過,設定 DontUseDesktopChangeRouter 項目會產生稍微較不有效率的變更通知處理。 專案是 REG_DWORD 型別,值是0x1。
DropTarget 這是類別識別碼 (CLSID)。 DropTarget 專案包含物件的 CLSID(通常是本機伺服器,而不是進程伺服器),可實作 IDropTarget。 根據預設,當置放目標是可執行檔,而且未提供DropTarget值時,Shell 會將已卸除檔案清單轉換成命令行參數,並將它傳遞至 ShellExecuteExecuteExlpParameters
路徑 提供字串(以分號分隔目錄清單的形式),以在呼叫 ShellExecuteEx啟動應用程式時附加至 PATH 環境變數。 這是 .exe的完整路徑。 其為 REG_SZ。 在 Windows 7 和更新版本中中,類型可以是 REG_EXPAND_SZ,而且通常會 REG_EXPAND_SZ %ProgramFiles%。 注意: 除了殼層所辨識的 [預設]、[路徑] 和 [DropTarget] 專案之外,應用程式也可以將自定義值新增至其可執行檔的 應用程式路徑 子機碼。 我們鼓勵應用程式開發人員使用 應用程式路徑 子機碼來提供應用程式特定路徑,而不是新增全域系統路徑。
SupportedProtocols 建立字串,其中包含指定密鑰的 URL 通訊協定配置。 這可以包含多個登錄值,以指出支援哪些配置。 此字串會遵循 scheme1:scheme2的格式。 如果這份清單不是空的,檔案: 會新增至字元串。 定義 SupportedProtocols 時,會隱含支援此通訊協定。
UseUrl 表示您的應用程式可以接受命令行上的 URL(而不是檔案名)。 可以直接從因特網開啟檔的應用程式,例如網頁瀏覽器和媒體播放機,應該設定此專案。
ShellExecuteEx 函式啟動應用程式且未設定 UseUrl=1 值時,ShellExecuteEx 將檔下載到本機檔案,並在本機複本上叫用處理程式。
例如,如果應用程式已設定此專案,並在儲存在網頁伺服器上的檔案上按下滑鼠右鍵,則會提供Open動詞命令。 如果沒有,用戶必須下載檔案並開啟本機複本。
UseUrl 專案的類型為 REG_DWORD,且值0x1。
在 Windows Vista 和更早版本中,當透過 ShellExecuteEx 呼叫時,這個專案會指出 URL 應該連同本機檔名一起傳遞至應用程式。 在 Windows 7 中,它表示應用程式可以了解傳遞給它的任何 HTTP 或 HTTPs URL,而不需要提供快取檔名。 此登錄機碼與 SupportedProtocols 機碼相關聯。

使用應用程式子機碼

透過在 HKEY_CLASSES_ROOT\Applications\ApplicationName.exe 子機碼下包含登錄專案,應用程式可以提供下表所示的應用程式特定資訊。

登錄專案 描述
shell\verb 提供從 OpenWith 呼叫應用程式的動詞方法。 若未在此指定動詞定義,系統會假設應用程式支援 CreateProcess,並在命令行上傳遞檔名。 此功能適用於所有動詞方法,包括DropTarget、ExecuteCommand和 Dynamic Data Exchange (DDE)。
DefaultIcon 可讓應用程式提供特定圖示來代表應用程式,而不是儲存在 .exe 檔案中的第一個圖示。
FriendlyAppName 提供一種方式,讓應用程式顯示可本地化的名稱,而不只是顯示的版本資訊,而可能無法當地語系化。 ASSOCSTR 關聯查詢 會讀取此登錄專案值,並回復為在版本資訊中使用 FileDescription 名稱。 如果遺漏該名稱,關聯查詢會預設為檔案的顯示名稱。 應用程式應該使用 ASSOCSTR_FRIENDLYAPPNAME 來擷取這項資訊,以取得適當的行為。
SupportedTypes 列出應用程式支援的檔案類型。 這麼做可讓應用程式列在 [使用 開啟] 對話框的串聯功能表中。
NoOpenWith 表示未指定任何應用程式來開啟此檔案類型。 請注意,如果已依檔類型為應用程式設定 OpenWithProgIDs 子機碼,且 ProgID 子機碼本身沒有 NoOpenWith 專案,該應用程式就會出現在建議或可用的應用程式清單中,即使它已指定 NoOpenWith 專案也一樣。 如需詳細資訊,請參閱 如何在 [開啟方式] 對話框 中包含應用程式,如何從 [以對話框開啟]排除應用程式。
IsHostApp 表示此程式是主機進程,例如 Rundll32.exe 或 Dllhost.exe,不應考慮 [開始] 功能表釘選或包含在 [最常使用] 清單中。 以包含非 Null 自變數清單或明確 應用程式使用者模型標識碼 (AppUserModelIDs)的快捷方式啟動時,程式可以釘選(如該快捷方式)。 這類快捷方式是 MFU 清單中的候選專案。
NoStartPage 指出應用程式可執行檔和快捷方式應該從 [開始] 功能表和 MFU 清單中釘選或包含 排除。 這個專案通常用來排除系統工具、安裝程式和卸載程式,以及自述檔。
UseExecutableForTaskbarGroupIcon 如果此應用程式沒有可釘選的快捷方式,則會讓任務列使用此可執行檔的預設圖示,而不是第一次遇到視窗的圖示。
TaskbarGroupIcon 指定用來覆寫任務列圖示的圖示。 視窗圖示通常用於任務列。 設定TaskbarGroupIcon專案會導致系統改用應用程式 .exe 中的圖示。

例子

透過 HKEY_CLASSES_ROOT\Applications\ApplicationName.exe 子機碼進行應用程式註冊的一些範例如下所示。 所有登錄專案值都是 REG_SZ 類型,除了默認類型為 DefaultIcon,其類型為 REG_EXPAND_SZ

HKEY_CLASSES_ROOT
   Applications
      wordpad.exe
         FriendlyAppName = @%SystemRoot%\System32\shell32.dll,-22069
HKEY_CLASSES_ROOT
   Applications
      wmplayer.exe
         SupportedTypes
            .3gp2
HKEY_CLASSES_ROOT
   Applications
      wmplayer.exe
         DefaultIcon
            (Default) = %SystemRoot%\system32\wmploc.dll,-730
HKEY_CLASSES_ROOT
   Applications
      WScript.exe
         NoOpenWith
HKEY_CLASSES_ROOT
   Applications
      photoviewer.dll
         shell
            open
               DropTarget
                  Clsid = {FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}
HKEY_CLASSES_ROOT
   Applications
      mspaint.exe
         SupportedTypes
            .bmp
            .dib
            .rle
            .jpg
            .jpeg
            .jpe
            .jfif
            .gif
            .emf
            .wmf
            .tif
            .tiff
            .png
            .ico

註冊動詞和其他檔案關聯資訊

HKEY_CLASSES_ROOT\SystemFileAssociations 底下註冊的子機碼 可讓殼層定義檔類型屬性的默認行為,並啟用共用檔案關聯。 當使用者變更檔類型的預設應用程式時,新預設應用程式的 ProgID 優先於提供動詞和其他關聯資訊。 此優先順序是因為它是關聯陣列中的第一個專案。 如果預設程式已變更,則不再提供上一個 ProgID 底下的資訊。

若要主動處理預設程式變更的後果,您可以使用 HKEY_CLASSES_ROOT\SystemFileAssociations 來註冊動詞和其他關聯資訊。 由於在關聯陣列中 ProgID 之後的位置,這些註冊的優先順序較低。 即使使用者變更預設程式,這些 SystemFileAssociationsregistration 仍穩定,並提供一個位置來註冊一律適用於特定文件類型的次要動詞。 如需登錄範例,請參閱本主題稍後的註冊感知類型

下列登錄範例顯示當使用者在 [控制面板] 中執行 [默認程式] 專案時,將 .mp3 檔案的預設值變更為 App2ProgID 時,會發生什麼情況。 變更預設值之後,Verb1 已不再可用,Verb2 會變成預設值。

HKEY_CLASSES_ROOT
   .mp3
      (Default) = App1ProgID
HKEY_CLASSES_ROOT
   App1ProgID
      shell
         Verb1
HKEY_CLASSES_ROOT
   App2ProgID
      shell
         Verb2

註冊感知類型

感知型別的登錄值會定義為 HKEY_CLASSES_ROOT\SystemFileAssociations 登錄子機碼的子機碼。 例如,感知的類型 文字 會註冊如下:

HKEY_CLASSES_ROOT
   SystemFileAssociations
      text
         shell
            edit
               command
                  (Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"
            open
               command
                  (Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"

檔類型的感知類型是以在檔類型的子機碼中包含 PerceivedType 值來表示。 PerceivedType 值會設定為 HKEY_CLASSES_ROOT\SystemFileAssociations 登錄子機碼下註冊的感知型別名稱,如上一個登錄範例所示。 例如,若要將.cpp檔案宣告為感知類型 「text」,請新增下列登錄專案:

HKEY_CLASSES_ROOT
   .cpp
      PerceivedType = text

檔案類型

檔案關聯的運作方式

依檔類型或種類 內容檢視

檔案類型驗證程式

檔案類型處理程式

程式設計標識碼

感知型別

關聯陣列