用修改注册表的方法来改变文件夹的打开方式

时间:2022-09-04 16:01:25
我现在要修改文件夹的打开方式,有两个方案:
1:修改注册表HKCR-Folder-shell-open-command项的默认参数,它原默认参数为
%SystemRoot%\Explorer.exe /idlist,%I,%L
前面应该是说用Explorer.exe打开,后面是传入的参数吧(不知这样理解是否有误),我想把它改为我自己的应用程序的路径,比如:D:\1.exe,然后再传入这个文件夹的路径,在我的1.exe程序中接受并作处理,但我该了注册表后一点效果都没有,双击文件夹照样能打开,我的1.exe根本没执行,不知这种思路是否可行?
2:删除HKCR-Folder-shell-open项,这样文件夹的右键菜单中应该就没有“打开”这一项了,然后我再在
HKCR-Directory-shell中添加子项“打开”,并把HKCR-Folder-shell的默认值设置为D:\1.exe,传入路径,这样的话,打开文件夹就会执行我的D:\1.exe

不知哪种方案更可行呢,其中很重要的问题是如何望我程序中传入文件夹路径呢,在我程序中又该如何接受呢?我觉得这应该是个很有技术含量的问题,希望牛人不吝赐教,定重分相赠!

5 个解决方案

#1


做Shell Extension...来获得文件夹打开等操作,以及路径

#2


我之前看过一个Shell Extension的例子,里面是通过点击文件夹的一项右键菜单后,在com组件中获取文件夹路径的,我如何通过其他方式得到路径呢,比如双击。然后我又想双击应该就是相当于点了右键菜单的第一项,但是我看的那个例子里面加的菜单是在winrar相关菜单后面,我怎么把这个菜单搞到第一项呢,或者说点击第一个菜单项与点击后面的某个菜单项是一样效果!
例子部分代码如下:
HRESULT CEnCodeTestClass::Initialize ( LPCITEMIDLIST pidlFolder,
                                    LPDATAOBJECT pDataObj,
                                    HKEY hProgID )
{
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };
HDROP     hDrop;

    // Look for CF_HDROP data in the data object.
    if ( FAILED( pDataObj->GetData ( &fmt, &stg )))
    {
// Nope! Return an "invalid argument" error back to Explorer.
return E_INVALIDARG;
    }

    // Get a pointer to the actual data.
    hDrop = (HDROP) GlobalLock ( stg.hGlobal );

    // Make sure it worked.
    if ( NULL == hDrop )
    {
return E_INVALIDARG;
    }

    // Sanity check - make sure there is at least one filename.
UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );

    if ( 0 == uNumFiles )
    {
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
    }

HRESULT hr = S_OK;

    // Get the name of the first file and store it in our member variable m_szFile.
    if ( 0 == DragQueryFile ( hDrop, 0, m_szFile, MAX_PATH ))   //获取路径
    {
hr = E_INVALIDARG;
    }

    GlobalUnlock ( stg.hGlobal );
    ReleaseStgMedium ( &stg );

    return hr;
}

//插入菜单部分
HRESULT CEnCodeTestClass::QueryContextMenu ( HMENU hmenu, UINT  uMenuIndex, 
                                          UINT  uidFirstCmd, UINT  uidLastCmd,
                                          UINT  uFlags )
{
    // If the flags include CMF_DEFAULTONLY then we shouldn't do anything.
    if ( uFlags & CMF_DEFAULTONLY )
    {
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );
    }
    InsertMenu ( hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, _T("菜单项1") );
    InsertMenu ( hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd+1, _T("菜单项2") );
    return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 2 );
}

oyljerry大哥,我前面也发了几个相关问题的帖子,你也给了我很大帮助,真的十分感谢,希望你能再点拨一下!

#3


没人知道?看来确实有难度,继续研究……

#4


楼主留个qq号码怎么样,我也在研究这个问题

#5


好像是文件夹选项里改就可以!

#1


做Shell Extension...来获得文件夹打开等操作,以及路径

#2


我之前看过一个Shell Extension的例子,里面是通过点击文件夹的一项右键菜单后,在com组件中获取文件夹路径的,我如何通过其他方式得到路径呢,比如双击。然后我又想双击应该就是相当于点了右键菜单的第一项,但是我看的那个例子里面加的菜单是在winrar相关菜单后面,我怎么把这个菜单搞到第一项呢,或者说点击第一个菜单项与点击后面的某个菜单项是一样效果!
例子部分代码如下:
HRESULT CEnCodeTestClass::Initialize ( LPCITEMIDLIST pidlFolder,
                                    LPDATAOBJECT pDataObj,
                                    HKEY hProgID )
{
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };
HDROP     hDrop;

    // Look for CF_HDROP data in the data object.
    if ( FAILED( pDataObj->GetData ( &fmt, &stg )))
    {
// Nope! Return an "invalid argument" error back to Explorer.
return E_INVALIDARG;
    }

    // Get a pointer to the actual data.
    hDrop = (HDROP) GlobalLock ( stg.hGlobal );

    // Make sure it worked.
    if ( NULL == hDrop )
    {
return E_INVALIDARG;
    }

    // Sanity check - make sure there is at least one filename.
UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );

    if ( 0 == uNumFiles )
    {
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
    }

HRESULT hr = S_OK;

    // Get the name of the first file and store it in our member variable m_szFile.
    if ( 0 == DragQueryFile ( hDrop, 0, m_szFile, MAX_PATH ))   //获取路径
    {
hr = E_INVALIDARG;
    }

    GlobalUnlock ( stg.hGlobal );
    ReleaseStgMedium ( &stg );

    return hr;
}

//插入菜单部分
HRESULT CEnCodeTestClass::QueryContextMenu ( HMENU hmenu, UINT  uMenuIndex, 
                                          UINT  uidFirstCmd, UINT  uidLastCmd,
                                          UINT  uFlags )
{
    // If the flags include CMF_DEFAULTONLY then we shouldn't do anything.
    if ( uFlags & CMF_DEFAULTONLY )
    {
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );
    }
    InsertMenu ( hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, _T("菜单项1") );
    InsertMenu ( hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd+1, _T("菜单项2") );
    return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 2 );
}

oyljerry大哥,我前面也发了几个相关问题的帖子,你也给了我很大帮助,真的十分感谢,希望你能再点拨一下!

#3


没人知道?看来确实有难度,继续研究……

#4


楼主留个qq号码怎么样,我也在研究这个问题

#5


好像是文件夹选项里改就可以!