當用戶右擊一個shell對象時,shell會顯示它的上下文菜單。文件系統對象有大量的標准菜單項,如"剪切"和"拷貝",這些都是缺省的菜單項。如果對象是一個文件,是文件類的成員,就能夠在注冊表裡指定附加的菜單項。Shell檢查注冊表,看看文件類型是否與一些上下文菜單handler相關聯,如果是,shell會咨詢這些handler是否添加額外的菜單項。
上下文菜單handler是一種shell擴展handler,它添加命令到已有的上下文菜單中。上下文菜單handler都與特定的文件類相關聯,並且在顯示這類文件的成員的上下文菜單時調用。通過實現和注冊這樣一個handler,能夠動態地添加菜單項到對象的上下文菜單上,從而為特殊的對象定制菜單。
上下文菜單Handler的工作原理
作為一種shell擴展handler,上下文菜單handler同所有其它handler一樣, 是進程內COM 對象,即對象作為動態連接庫 (DLL)實現。除了IUnknown接口外,上下文菜單還必須導出IShellExtInit和IContextMenu接口,作為選擇,上下文菜單也能導出IContextMenu2和IContextMenu3,這些接口可以實現自畫菜單項。
IShellExtInit接口僅僅被shell用來初始化handler,主要的操作通過handler的IContextMenu接口進行。Shell首先調用IContextMenu::QueryContextMenu,傳送一個HMENU句柄,這個方法用它來增加上下文菜單。如果用戶亮選了這些新添加的某個命令項, IContextMenu::GetCommandString將被調用,以取得這條菜單的幫助信息,把它顯示在資源管理器的狀態條上。如果用戶單擊了handler的條目,shell調用IContextMenu::InvokeCommand,從而handler能夠執行合適的操作。
實現IContextMenu接口
1、實現QueryContextMenu方法