應用程式註冊
本主題討論應用程式如何公開啟用特定案例所需本身的相關信息。 這包括尋找應用程式所需的資訊、應用程式支援的動詞,以及應用程式可以處理的檔案類型。
本主題的組織方式如下:
注意
應用程式也可以在 [設定程式存取] 和 [計算機預設值] 和 [設定預設程式] (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(適用於非文件系統物件)。
若要向應用程式路徑子機碼註冊及控制應用程式的行為:
將與可執行檔同名的子機碼新增至 應用程式路徑 子機碼,如下列登錄專案所示。
HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER SOFTWARE Microsoft Windows CurrentVersion App Paths file.exe (Default) DontUseDesktopChangeRouter DropTarget Path UseUrl
如需 應用程式路徑 子機碼專案的詳細數據,請參閱下表。
登錄專案 | 詳 |
---|---|
(預設值) | 這是應用程式的完整路徑。 在 (Default) 專案中提供的應用程式名稱,可以使用或不使用其 .exe 擴展名來表示。 如有必要,ShellExecuteEx 函式會在搜尋 應用程式路徑 子機碼時新增延伸模組。 專案是 REG_SZ 類型。 |
DontUseDesktopChangeRouter | 調試程式應用程式在偵錯 Windows 檔案總管程式時,必須避免檔案對話框死結。 不過,設定 DontUseDesktopChangeRouter 項目會產生稍微較不有效率的變更通知處理。 專案是 REG_DWORD 型別,值是0x1。 |
DropTarget | 這是類別識別碼 (CLSID)。 DropTarget 專案包含物件的 CLSID(通常是本機伺服器,而不是進程伺服器),可實作 IDropTarget。 根據預設,當置放目標是可執行檔,而且未提供DropTarget值時,Shell 會將已卸除檔案清單轉換成命令行參數,並將它傳遞至 ShellExecuteExecuteEx 到 lpParameters。 |
路徑 | 提供字串(以分號分隔目錄清單的形式),以在呼叫 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