青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

l

成都手游碼農(nóng)一枚
隨筆 - 32, 文章 - 0, 評(píng)論 - 117, 引用 - 0
數(shù)據(jù)加載中……

windows shell擴(kuò)展右鍵菜單。

由于工作的需求要實(shí)現(xiàn)像winrara那樣的shell擴(kuò)展菜單,帶圖標(biāo)的,針對(duì)某個(gè)類型的文件執(zhí)行相應(yīng)的操作,
查了不少資料,終于解決了,效果如下圖中紅色矩形部分。



最先想到的當(dāng)然是最方便的,直接添加注冊(cè)表,只需在HCLR中需要處理的類型(即右鍵選中的文件類型)的注冊(cè)表項(xiàng)中的shell子鍵中加入新項(xiàng),
修改默認(rèn)值為顯示名稱,顯示效果如上圖的<用“記事本”打開>菜單項(xiàng)。(*)代表任意類型的文件。



然后再新項(xiàng)中加入command子鍵,默認(rèn)值設(shè)置為運(yùn)行程序的參數(shù),如"notepad.exe %1”,其中%1代表右鍵選中的文件。

這樣當(dāng)點(diǎn)擊菜單后就可以執(zhí)行你指定的程序("notepad")并傳入選中的文件名作為命令參數(shù),這樣就可以處理這個(gè)文件了。

其實(shí)這樣足以滿足需求了,但效果上還差了一點(diǎn),很明顯少了個(gè)圖標(biāo)。既然winrar都能實(shí)現(xiàn),肯定是還有其它實(shí)現(xiàn)的方法了。

于是就是處理圖標(biāo)了,然而最終沒能找到好的方法,但如果是win7的話,還是有的,那就是在command中加入icon項(xiàng),值為

你的目標(biāo)程序,然而如果是xp就行不通了。

本想簡(jiǎn)單的解決,但沒想到還是得用上復(fù)雜的方法,僅僅為了一個(gè)圖標(biāo) - -;。

復(fù)雜的方法只能是通過擴(kuò)展shell接口來實(shí)現(xiàn),首先肯定得牽涉到COM,所以關(guān)于COM可以上網(wǎng)查下資料,再這里就不多說(其實(shí)

讓我講我也不一定講得清楚),這里我就寫下得注意的地方就是了。

1.創(chuàng)建工程這里我用的VS2005,創(chuàng)建一個(gè)ATL 項(xiàng)目,屬性不需要改,點(diǎn)默認(rèn)的就可以了。

2.右擊項(xiàng)目,添加,類,添加一個(gè)新ATL簡(jiǎn)單對(duì)象。

3.編輯代碼,關(guān)于IShellExtInit和IContextMenu接口可以查看MSDN,上面寫的很詳細(xì)。

 

// CCContextMenuExt

class ATL_NO_VTABLE CCContextMenuExt :
    
public CComObjectRootEx<CComSingleThreadModel>,
    
public CComCoClass<CCContextMenuExt, &CLSID_CContextMenuExt>,
    
public IDispatchImpl<ICContextMenuExt, &IID_ICContextMenuExt, &LIBID_CtxMenuExtLib, /*wMajor =*/ 1/*wMinor =*/ 0>,
    
public IShellExtInit,
    
public IContextMenu
{
public:
    CCContextMenuExt()
    
{
    }


DECLARE_REGISTRY_RESOURCEID(IDR_CCONTEXTMENUEXT)


BEGIN_COM_MAP(CCContextMenuExt)
    COM_INTERFACE_ENTRY(ICContextMenuExt)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IShellExtInit)
    COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    
{
        m_hBitmap 
= LoadBitmap(_hInstance, MAKEINTRESOURCE(IDB_MENU));
        
return S_OK;
    }


    
void FinalRelease()
    
{
        
if (m_hBitmap)
        
{
            DeleteObject(m_hBitmap);
        }

    }


public:
    
enum 
    
{
        IDM_CTXMENU 
= 0,
    }
;

public:

    HRESULT STDMETHODCALLTYPE Initialize( 
        
/* [in] */ LPCITEMIDLIST pidlFolder,
        
/* [in] */ IDataObject *pdtobj,
        
/* [in] */ HKEY hkeyProgID)
    
{
        HRESULT hr;
        UINT    nFileCount;
        UINT    nLen;

        FORMATETC fmt 
= 
        
{
            CF_HDROP,
            NULL,
            DVASPECT_CONTENT,
            
-1,
            TYMED_HGLOBAL
        }
;

        STGMEDIUM sm 
= 
        
{
            TYMED_HGLOBAL
        }
;

        hr 
= pdtobj->GetData(&fmt, &sm);
       
        
if (FAILED(hr))
        
{
            
return hr;
        }


        nFileCount 
= DragQueryFile((HDROP)sm.hGlobal, 0xFFFFFFFF, NULL, 0);

        
if (nFileCount >= 1)
        
{
            nLen 
= DragQueryFile((HDROP)sm.hGlobal, 0, m_pszFileName, sizeof(m_pszFileName));
            
            
if (nLen >0 && nLen <MAX_PATH)
            
{
                m_pszFileName[nLen] 
= _T('\0');
                hr 
= S_OK;
            }

            
else
            
{
                hr 
= E_INVALIDARG;
            }
    
        }

        
else
        
{            
            hr 
= E_INVALIDARG;
        }


        ReleaseStgMedium(
&sm);

        
return hr;
    }


    STDMETHOD(QueryContextMenu)(THIS_
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags)
    
{
        MENUITEMINFO mii;

        
if (uFlags & CMF_DEFAULTONLY)
        
{
            
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);
        }


        memset((
void*)&mii, 0sizeof(mii));
        mii.cbSize      
= sizeof(mii);
        mii.fMask       
= MIIM_STRING | MIIM_CHECKMARKS | MIIM_ID | MIIM_STATE;
        mii.cch         
= lstrlen(SZ_MENUTEXT);
        mii.dwTypeData  
= SZ_MENUTEXT;

        
/*
            這里用hbmpChecked而不用hbmpItem的原因
            - -自己動(dòng)手試試就知道了。
        
*/

        mii.hbmpItem
        mii.hbmpChecked 
= m_hBitmap;
        mii.hbmpUnchecked 
= m_hBitmap;
        mii.fState      
= MFS_ENABLED;
        mii.wID         
= idCmdFirst + indexMenu;

        
if (!InsertMenuItem(hmenu, indexMenu, TRUE, &mii))       
        
{
             
return E_FAIL;
        }


        lstrcpynA(m_pszVerb, 
"protected_run"32);
        lstrcpynW(m_pwszVerb, L
"protected_run"32);

        
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, IDM_CTXMENU + 1);
    }


    STDMETHOD(InvokeCommand)(THIS_
        LPCMINVOKECOMMANDINFO lpici)
    
{
        BOOL fEx 
= FALSE;
        BOOL fUnicode 
= FALSE;

        
if(lpici->cbSize == sizeof(CMINVOKECOMMANDINFOEX))
        
{
            fEx 
= TRUE;
            
if((lpici->fMask & CMIC_MASK_UNICODE))
            
{
                fUnicode 
= TRUE;
            }

        }


        
if!fUnicode && HIWORD(lpici->lpVerb))
        
{
            
if(StrCmpIA(lpici->lpVerb, m_pszVerb))
            
{
                
return E_FAIL;
            }

        }


        
else if( fUnicode && HIWORD(((CMINVOKECOMMANDINFOEX *) lpici)->lpVerbW))
        
{
            
if(StrCmpIW(((CMINVOKECOMMANDINFOEX *)lpici)->lpVerbW, m_pwszVerb))
            
{
                
return E_FAIL;
            }

        }


        
else if(LOWORD(lpici->lpVerb) != IDM_CTXMENU)
        
{
            
return E_FAIL;
        }


        
else
        
{
            
//在此處理點(diǎn)擊事件.
            MessageBox(NULL, m_pszFileName, _T(""), MB_OK);

            
return S_OK;
            
        }


        
return E_FAIL;

    }


    STDMETHOD(GetCommandString)(THIS_
        UINT_PTR    idCmd,
        UINT        uType,
        UINT      
* pwReserved,
        LPSTR       pszName,
        UINT        cchMax)
    
{
        HRESULT  hr 
= E_INVALIDARG;
        
static CHAR szHelpTextA[] = "windows擴(kuò)展菜單!";
        
static WCHAR szHelpTextW[] = L"windows擴(kuò)展菜單!";

        
if(idCmd != IDM_CTXMENU)
        
{
            
return hr;
        }


        
switch(uType)
        
{
        
case GCS_HELPTEXTA:
            lstrcpynA((CHAR
*)pszName, szHelpTextA, cchMax);
            
break

        
case GCS_HELPTEXTW: 
            lstrcpynW((WCHAR
*)pszName, szHelpTextW, cchMax);;
            
break

        
case GCS_VERBA:
            lstrcpynA((CHAR
*)pszName, m_pszVerb, cchMax);
            
break

        
case GCS_VERBW:
            lstrcpynW((WCHAR
*)pszName, m_pwszVerb, cchMax);
            
break;

        
default:
            hr 
= S_OK;
            
break
        }

        
return hr;
    }


private:
    TCHAR   m_pszFileName[MAX_PATH];
    HBITMAP m_hBitmap;
    CHAR    m_pszVerb[
32];
    WCHAR   m_pwszVerb[
32];

}
;


4.修改服務(wù)注冊(cè)、取消注冊(cè)函數(shù),這里只需在需要處理的文件類型的shllex下的ContextMenuHandlers下創(chuàng)建項(xiàng),并設(shè)置接口ID。

// DllRegisterServer - 將項(xiàng)添加到系統(tǒng)注冊(cè)表
STDAPI DllRegisterServer(void)
{
    
// 注冊(cè)對(duì)象、類型庫(kù)和類型庫(kù)中的所有接口
    HRESULT hr;
    HKEY hKey;

    
static char pszGUID[] = "{C2397F2E-4BA3-4B9D-858A-F775761C023B}";

    hr 
= _AtlModule.DllRegisterServer();
    
if (FAILED(hr))
    
{
        
return hr;
    }


    
if (RegCreateKeyA(HKEY_CLASSES_ROOT, 
        
"*\\shellex\\ContextMenuHandlers\\CtxMenu"&hKey) != ERROR_SUCCESS)
    
{
        
return E_FAIL;
    }


    
if (RegSetValueA(hKey, NULL, REG_SZ, pszGUID,
            (DWORD)strlen(pszGUID)) 
!= ERROR_SUCCESS)
    
{
        RegCloseKey(hKey);
        
return E_FAIL;
    }


  
    
return hr;
}



// DllUnregisterServer - 將項(xiàng)從系統(tǒng)注冊(cè)表中移除
STDAPI DllUnregisterServer(void)
{
    RegDeleteKeyA(HKEY_CLASSES_ROOT, 
"*\\shellex\\ContextMenuHandlers\\CtxMenu");

    
return _AtlModule.DllUnregisterServer();
}


5.編譯運(yùn)行,VS會(huì)自動(dòng)替你注冊(cè),當(dāng)然也可以用regsvr32 自己注冊(cè)。

下載地址:http://www.shnenglu.com/Files/shly/CtxMenuExt.rar

注意:注冊(cè)后的DLL無法刪除,有種方法可以就是regsvr32 /u 取消注冊(cè)dll, 然后重啟explorer.exe。

posted on 2011-10-09 21:37 l1989 閱讀(12266) 評(píng)論(8)  編輯 收藏 引用 所屬分類: windows

評(píng)論

# re: windows shell擴(kuò)展右鍵菜單。[未登錄]  回復(fù)  更多評(píng)論   

很好收藏!
2011-10-11 11:13 | 飯中淹

# re: windows shell擴(kuò)展右鍵菜單。  回復(fù)  更多評(píng)論   

總感覺COM入門太難
2011-10-11 17:31 | LoveBeyond

# re: windows shell擴(kuò)展右鍵菜單。  回復(fù)  更多評(píng)論   

@LoveBeyond
嗯嗯,我也覺得好難,要不是受工作所迫,我才不會(huì)去看這些折磨自己。。。
2011-10-11 17:38 | azl

# re: windows shell擴(kuò)展右鍵菜單。[未登錄]  回復(fù)  更多評(píng)論   

我測(cè)試了下, 點(diǎn)擊文件的右鍵菜單能顯示。 但是點(diǎn)擊文件夾就沒有, 如果讓文件夾的右鍵菜單中也增加???
2011-12-08 12:53 | WONDER

# re: windows shell擴(kuò)展右鍵菜單。  回復(fù)  更多評(píng)論   

@WONDER
怎么點(diǎn)擊文件夾也有自定義菜單,你實(shí)現(xiàn)了么
2013-04-09 20:07 | zxgwxit

# re: windows shell擴(kuò)展右鍵菜單。[未登錄]  回復(fù)  更多評(píng)論   

恩。很不錯(cuò)。對(duì)于簡(jiǎn)單的用第一種方法就可以了,不需要?jiǎng)?chuàng)建com組件。第二種創(chuàng)建com組件的方法,也可以學(xué)習(xí)一下。
2013-09-21 11:41 | 王小亮

# re: windows shell擴(kuò)展右鍵菜單。[未登錄]  回復(fù)  更多評(píng)論   

我拿這個(gè)例子操作了為什么,右鍵就是不見菜單呢,求幫助@WONDER
2013-10-07 21:04 | Jeremy

# re: windows shell擴(kuò)展右鍵菜單。  回復(fù)  更多評(píng)論   

注冊(cè)了重啟explorer以后,右鍵菜單還是沒有新加項(xiàng)嘛
2014-06-24 13:56 | forcj
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            av成人黄色| 国产美女精品视频| 亚洲激情网站免费观看| 美腿丝袜亚洲色图| 欧美高清视频免费观看| 亚洲一区国产视频| 久久国产婷婷国产香蕉| 亚洲精品小视频| 亚洲私人影吧| 在线观看成人av电影| 亚洲高清不卡av| 国产精品白丝jk黑袜喷水| 久久福利影视| 欧美14一18处毛片| 亚洲欧美在线网| 久久夜色精品| 午夜精品视频在线| 久久这里有精品视频| 亚洲女同精品视频| 久久久久久久综合狠狠综合| 一本一道久久综合狠狠老精东影业| 亚洲性av在线| 亚洲免费观看高清在线观看| 午夜欧美理论片| 亚洲精品欧美| 欧美在线观看视频一区二区| 一区二区三区产品免费精品久久75 | 久久精品女人| 欧美日本一区| 美乳少妇欧美精品| 国产欧美日韩视频一区二区三区| 欧美激情1区2区3区| 国产色产综合产在线视频| 亚洲日本成人| 91久久在线| 久久国产精品久久久久久| 亚洲一区二区欧美日韩| 欧美v日韩v国产v| 久久激情视频| 国产精品美女在线观看| 最新精品在线| 亚洲欧洲另类国产综合| 久久精品国产免费| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美成ee人免费视频| 欧美专区福利在线| 国产精品第一区| 亚洲精品网址在线观看| 亚洲国产精品嫩草影院| 久久精品国产久精国产一老狼| 午夜精品久久久| 欧美日韩成人在线观看| 亚洲国产婷婷综合在线精品 | 国产精品久99| 亚洲剧情一区二区| 99精品欧美一区二区三区综合在线 | 老司机精品久久| 久久久蜜桃一区二区人| 国产欧美三级| 午夜欧美理论片| 久久久久国产精品厨房| 国产在线精品一区二区夜色| 亚洲欧美日韩一区| 久久精品免视看| 影音先锋在线一区| 乱人伦精品视频在线观看| 欧美本精品男人aⅴ天堂| 亚洲大胆女人| 欧美黄色一级视频| 日韩亚洲精品在线| 午夜日韩激情| 国产一区二区三区视频在线观看| 午夜在线不卡| 男女精品网站| 亚洲精品小视频| 欧美三级日韩三级国产三级| 亚洲夜间福利| 久久―日本道色综合久久| 亚洲国产精品传媒在线观看| 你懂的视频欧美| 99一区二区| 久久精品天堂| 亚洲美女网站| 国产精品亚洲综合色区韩国| 久久成人一区二区| 亚洲第一在线综合在线| 亚洲综合久久久久| 精品二区视频| 欧美日韩一区二区国产| 欧美在线高清| 亚洲精品字幕| 久久人人爽人人爽| 夜夜嗨av色一区二区不卡| 国产日韩高清一区二区三区在线| 久久久天天操| 在线综合视频| 欧美激情欧美激情在线五月| 午夜精品视频| 亚洲精品免费在线播放| 性18欧美另类| 亚洲欧美国产一区二区三区| 一区二区三区无毛| 欧美先锋影音| 蜜桃久久精品乱码一区二区| 亚洲一区二区三区高清不卡| 亚洲韩日在线| 老司机久久99久久精品播放免费| 一区二区三区高清在线| 曰韩精品一区二区| 国产精品伊人日日| 欧美日韩国产专区| 另类酷文…触手系列精品集v1小说| 亚洲图片在区色| 亚洲精品乱码久久久久久| 裸体歌舞表演一区二区| 亚洲欧美国产高清va在线播| 亚洲精品偷拍| 亚洲成人自拍视频| 国产一区二区欧美| 国产精品毛片va一区二区三区 | 尤物yw午夜国产精品视频明星| 国产精品分类| 欧美女同视频| 欧美成人一区二区三区片免费| 久久动漫亚洲| 欧美专区在线观看一区| 性欧美videos另类喷潮| 亚洲专区在线| 亚洲一区在线直播| 一区二区精品国产| 一区二区动漫| 夜夜夜久久久| 一区二区三区四区国产| 日韩亚洲一区在线播放| 亚洲精品你懂的| 欧美福利精品| 亚洲国产另类 国产精品国产免费| 免费久久99精品国产自| 久久伊人精品天天| 美女图片一区二区| 欧美成人免费网站| 欧美激情综合| 亚洲国产激情| 亚洲精品久久嫩草网站秘色| 亚洲日本中文字幕区| 99视频精品在线| 亚洲一区欧美二区| 欧美一区二区私人影院日本| 欧美一级夜夜爽| 久久蜜桃香蕉精品一区二区三区| 久久一区二区三区av| 欧美第一黄色网| 欧美特黄一级| 国产亚洲视频在线观看| 在线观看日韩av电影| 日韩亚洲国产精品| 中文在线一区| 久久久噜噜噜久噜久久| 亚洲福利视频一区二区| 亚洲免费观看在线观看| 午夜亚洲激情| 牛人盗摄一区二区三区视频| 欧美日韩久久| 国产婷婷色一区二区三区四区| 亚洲电影av| 亚洲免费一在线| 免费久久久一本精品久久区| 亚洲精品乱码久久久久久蜜桃麻豆| 宅男噜噜噜66一区二区66| 欧美一区二区三区四区在线| 欧美成人亚洲成人| 国产精品普通话对白| 亚洲高清在线| 午夜视频在线观看一区二区三区 | 99re8这里有精品热视频免费| 亚洲素人在线| 美女国产一区| 国产精品视频免费在线观看| 亚洲高清中文字幕| 亚洲欧美一级二级三级| 欧美aⅴ99久久黑人专区| 在线亚洲免费| 麻豆精品视频在线观看| 国产精品一区二区黑丝| 日韩视频不卡中文| 久热re这里精品视频在线6| 日韩一区二区免费看| 久久精品日韩欧美| 国产精品久久久久久久久久久久久| 在线成人中文字幕| 欧美一区二区三区四区夜夜大片| 亚洲国产精品va| 久久国产一二区| 国产女人aaa级久久久级| 在线视频欧美日韩精品| 欧美激情 亚洲a∨综合| 久久激情网站| 国产午夜精品视频| 欧美亚洲一区二区三区| 日韩视频在线观看免费|