應用程式註冊

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

本主題的組織方式如下:

注意

應用程式也可以在 [設定程式存取] 和 [電腦預設值] (SPAD) 中註冊,並在 [控制台] 應用程式中 (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\應用程式路徑下註冊。 針對電腦的所有使用者安裝的應用程式,可以在[軟體] [Microsoft\Windows\CurrentVersion\應用程式路徑] 下註冊HKEY_LOCAL_MACHINE \\ 。

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

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

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

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

可能要注意的問題包括:

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

使用 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 會將已卸載檔案清單轉換成命令列參數,並透過lpParameters將它傳遞至ShellExecuteEx
路徑 以分號分隔目錄清單的形式提供字串 (,) 呼叫 ShellExecuteEx啟動應用程式時附加至 PATH 環境變數。 這是 .exe 的完整路徑。 它是 REG_SZ。 在 Windows 7 和更新版本中,類型可以是 REG_EXPAND_SZ,而且通常會 REG_EXPAND_SZ %ProgramFiles% 。 注意: 除了 Shell 所辨識的 (Default) 、Path 和 DropTarget 專案之外,應用程式也可以將自訂值新增至其可執行檔的 [應用程式路徑 ] 子機碼。 我們鼓勵應用程式開發人員使用 應用程式路徑 子機碼來提供應用程式特定路徑,而不是新增全域系統路徑。
SupportedProtocols 建立字串,其中包含指定金鑰的 URL 通訊協定配置。 這可以包含多個登錄值,以指出支援哪些配置。 此字串遵循 scheme1:scheme2的格式。 如果這份清單不是空的, 則會將 file: 新增至字串。 定義 SupportedProtocols 時,隱含支援此通訊協定。
UseUrl 表示您的應用程式可以接受 URL (,而不是命令列上的檔案名) 。 可以直接從網際網路開啟檔的應用程式,例如網頁瀏覽器和媒體播放機,應該設定此專案。
ShellExecuteEx 函式啟動應用程式且未設定 UseUrl=1 值時, ShellExecuteEx 會將檔下載到本機檔案,並在本機複本上叫用處理程式。
例如,如果應用程式已設定此專案,且使用者以滑鼠右鍵按一下儲存在網頁伺服器上的檔案,則會提供 Open 動詞命令。 如果沒有,使用者必須下載檔案並開啟本機複本。
UseUrl 專案的類型 為 REG_DWORD ,且值為 0x1。
在 Windows Vista 和更早版本中,此專案表示透過 ShellExecuteEx 呼叫時,URL 應該連同本機檔案名一起傳遞至應用程式。 在 Windows 7 中,它表示應用程式可以瞭解傳遞給它的任何 HTTP 或 HTTPs URL,而不需要提供快取檔案名。 此登錄機碼與 SupportedProtocols 機碼相關聯。

使用應用程式子機碼

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

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

範例

透過HKEY_CLASSES_ROOTApplications\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_ROOTsystemFileAssociations下註冊\ 子機碼可讓殼層定義檔案類型屬性的預設行為,並啟用共用檔案關聯。 當使用者變更檔案類型的預設應用程式時,新預設應用程式的 ProgID 優先提供動詞和其他關聯資訊。 此優先順序是因為它是關聯陣列中的第一個專案。 如果預設程式已變更,就無法再使用先前 ProgID 底下的資訊。

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

下列登錄範例顯示當使用者在 主控台 中執行[預設程式]專案,將 .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

檔案類型

檔案關聯的運作方式

依檔案類型或種類檢視內容

檔案類型驗證程式

檔案類型處理常式

程式設計識別碼

認知類型

關聯陣列