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大哥,我前面也发了几个相关问题的帖子,你也给了我很大帮助,真的十分感谢,希望你能再点拨一下!
例子部分代码如下:
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大哥,我前面也发了几个相关问题的帖子,你也给了我很大帮助,真的十分感谢,希望你能再点拨一下!
例子部分代码如下:
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
好像是文件夹选项里改就可以!