快捷功能表處理程式和多個動詞的最佳做法
本主題的組織方式如下:
最佳做法
靜態動詞是最簡單的動詞實作,並提供豐富的功能。 強烈建議您使用其中一個靜態動詞方法實作動詞。
動詞實作的最佳做法
下列清單代表動詞實作的最佳做法:
- 一律選擇最簡單且符合您需求的動詞方法。
- 可能的話,請使用靜態動詞方法。
- 請勿在UI線程上執行需要大量資源的作業或I/O。 IShellExtInit::Initialize 和 IContextMenu::QueryContextMenu 都必須在執行的工作中非常保守。 IContextMenu::InvokeCommand 必須在另一個進程中執行,或者您必須建立新的線程,以避免封鎖呼叫端。
- 具有獨立軟體廠商 (ISV) 名稱的前置詞動詞,如下所示。
ISVName.verb
使用不合格的名稱可能會導致與多個選擇相同動詞名稱的ISV發生衝突。 - 一律使用應用程式特定的 ProgID。 因為某些項目類型不會使用此對應,因此需要廠商唯一的名稱。
- 將UI放置在相對於叫用方法的位置,但不會在叫用者線程上執行。
- 不接受傳遞至 IContextMenu::InvokeCommand 方法之標準動詞命令的傳回值S_OK。 這麼做會導致叫用實際動詞實作失敗,並傳回標準動詞動詞的失敗碼。 如果您不支持標準動詞,則在遇到非零 HIWORD(lpVerb) 值時傳回失敗。
- 請避免使用 rundll32.exe 作為動詞命令的主機。
- 實作 IContextMenu::QueryContextMenu 時,請務必使用 ResultFromShort 宏,透過 HRESULT 值傳回已新增至功能表的動詞數目。
- 如果您在下列其中一個登錄機碼項目上註冊,請小心謹慎,並務必在最特定的類型上註冊處理程式,以減少可能意外的結果:
- HKEY_CLASSES_ROOT\*
- HKEY_CLASSES_ROOT\AllFileSystemObjects
- HKEY_CLASSES_ROOT\Folder
- HKEY_CLASSES_ROOT\Directory
- 只有在您預期可能需要變更快捷方式功能表中的默認動詞時,才設定MayChangeDefaultMenu鍵。 如果您的處理程式未變更默認動詞,則您不應該設定此索引鍵,因為這樣做會導致系統不必要地載入 DLL。
- 將您在 IShellExtInit::Initialize 中執行的工作降到最低。 針對快捷方式功能表處理程式,擷取傳遞至 IShellExtInit::Initialize 的數據對象,然後在 IContextMenu::QueryContextMenu 或 IContextMenu::InvokeCommand 中處理它。
多個選取動詞的最佳做法
由於多選區動詞案例中的項目數目可能很大,因此請務必考慮動詞實作的效能影響。 例如,當使用者在包含大量專案的範圍上搜尋 「*」,然後按下 [ 全 選] 並按兩下滑鼠右鍵時,動詞會顯示一個可以有數千個項目的選取專案。 因此,動詞命令應該只考慮選取範圍中的第一個專案,以及整體項目計數。 第一個專案定義為檢視頂端的專案,或使用者第一次以滑鼠右鍵按兩下的專案。
在 Windows 7 和更新版本中,查詢快捷方式功能表時傳遞至動詞的項目數目限制為 16。 然後重新建立動詞,並在叫用該動詞時,使用完整選取專案重新初始化動詞。
在某些情況下,請考慮少量固定專案。 例如,「差異」動詞只考慮前兩個專案是適當的。 一般而言,您不需要測試選取範圍中的每個專案,以查看其屬性是否為特定類型,或查詢選取範圍中的每個專案。 查看第一個專案,並決定是否適合新增動詞。
異質性選取專案
開放式動詞會在多重選取案例中自動新增,假設動詞可以處理未指定的專案。 相反地,當選取範圍包含未指定的專案時,不會新增悲觀動詞,而且只會在項目數目很小的情況下新增。
玩家樣式動詞應該是開放式的,並以無訊息方式略過未處理的專案。 如果無法對專案採取行動可能會導致數據遺失或混淆,則動詞命令應該警告使用者無法處理的專案。 例如,「備份」動詞應該表示某些項目無法備份。
相關主題