作为开发人员总是要时不时使用命令行,为此用Win+R热键输入cmd的方式,然后在dos窗体通过
CD命令一步步转到命令所在目录,这系列操作多了就有点繁琐了,有没有简单的方式呢?
网上搜了一把,有在注册表加入几项即可的办法,方法如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT/Directory/shell/cmd]
@="进入DOS"
[HKEY_CLASSES_ROOT/Directory/shell/cmd/command]
@="cmd.exe /k /"cd %L/""
[HKEY_CLASSES_ROOT/Drive/shell/cmd]
@="进入DOS"
[HKEY_CLASSES_ROOT/Drive/shell/cmd/command]
@="cmd.exe /k /"cd %L/""
把以上保存为reg文件,然后导入注册表中即可,刚开始用的挺欢快,省了很多事,但是用了一段时间后,还是不够爽,为何?
原来这个咚咚不能在我所浏览的当前目录的视图背景上让我进入dos,非要在目录上右键菜单才可以。
想了想看来图方便还不能图省事,只能写个简单的COM插件了,下面为插件执行效果,这下方便了。哈

这里好像不能上传代码,只好列出来了,主要代码如下:
atl工程
//
OpenDos.h : Declaration of the COpenDos
#ifndef __OPENDOS_H_
#define
__OPENDOS_H_

#include
"
resource.h
"
//
main symbols

/**/
/////
//
COpenDos
class
ATL_NO_VTABLE COpenDos :
public
CComObjectRootEx
<
CComSingleThreadModel
>
,
public
CComCoClass
<
COpenDos,
&
CLSID_OpenDos
>
,
public
IOpenDos,
public
IShellExtInit,
public
IContextMenu

...
{
public:
COpenDos()

...{
}

DECLARE_REGISTRY_RESOURCEID(IDR_OPENDOS)
DECLARE_NOT_AGGREGATABLE(COpenDos)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(COpenDos)
COM_INTERFACE_ENTRY(IOpenDos)
COM_INTERFACE_ENTRY(IShellExtInit)
COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()

// IOpenDos
public:
// IShellExtInit
STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY);
// IContextMenu
STDMETHODIMP GetCommandString(UINT, UINT, UINT*, LPSTR, UINT);
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO);
STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT);
protected:
TCHAR m_szFile [MAX_PATH];
}
;

#endif
//
__OPENDOS_H_






/**/
//
//
OpenDos.cpp : Implementation of COpenDos
#include
"
stdafx.h
"
#include
"
DosHere.h
"
#include
"
OpenDos.h
"


/**/
/////
//
COpenDos


/**/
/////
//
COpenDos
STDMETHODIMP COpenDos::Initialize (
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID )

...
{

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

STGMEDIUM stg = ...{ TYMED_HGLOBAL };
HDROP hDrop;

if( !pDataObj )

...{
if( pidlFolder )

...{
TCHAR tcPath[ MAX_PATH ];
if( !SHGetPathFromIDList( pidlFolder , tcPath ))

...{
return E_INVALIDARG;
}
else

...{
lstrcpy(m_szFile, tcPath);
return S_OK;
}
}
else

...{
return E_INVALIDARG;
}
}

// 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 );
HRESULT hr = S_OK;

if ( 0 == uNumFiles )

...{
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
}

// 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;
}

STDMETHODIMP COpenDos::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("Open &Dos Here") );

return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 1 );
}

STDMETHODIMP COpenDos::GetCommandString (
UINT idCmd, UINT uFlags, UINT
*
pwReserved, LPSTR pszName, UINT cchMax )

...
{
USES_CONVERSION;

// Check idCmd, it must be 0 since we have only one menu item.
if ( 0 != idCmd )
return E_INVALIDARG;

// If Explorer is asking for a help string, copy our string into the
// supplied buffer.
if ( uFlags & GCS_HELPTEXT )

...{
LPCTSTR szText = _T("Open dos console here.");

if ( uFlags & GCS_UNICODE )

...{
// We need to cast pszName to a Unicode string, and then use the
// Unicode string copy API.
lstrcpynW ( (LPWSTR) pszName, T2CW(szText), cchMax );
}
else

...{
// Use the ANSI string copy API to return the help string.
lstrcpynA ( pszName, T2CA(szText), cchMax );
}

return S_OK;
}

return E_INVALIDARG;
}

STDMETHODIMP COpenDos::InvokeCommand ( LPCMINVOKECOMMANDINFO pCmdInfo )

...
{
// If lpVerb really points to a string, ignore this function call and bail out.
if ( 0 != HIWORD( pCmdInfo->lpVerb ) )
return E_INVALIDARG;

// Get the command index - the only valid one is 0.
switch ( LOWORD( pCmdInfo->lpVerb) )

...{
case 0:

...{
TCHAR szMsg [MAX_PATH + 32];
wsprintf ( szMsg, _T("cmd.exe /k "%c: && cd %s""), m_szFile[0],m_szFile );

//MessageBox ( pCmdInfo->hwnd, szMsg, _T("SimpleShlExt"),
// MB_ICONINFORMATION );
WinExec(szMsg,SW_SHOW);

return S_OK;
}
break;

default:
return E_INVALIDARG;
break;
}
}



/**/
////
//
DosHere.cpp : Implementation of DLL Exports.


//
Note: Proxy/Stub Information
//
To build a separate proxy/stub DLL,
//
run nmake -f DosHereps.mk in the project directory.
#include
"
stdafx.h
"
#include
"
resource.h
"
#include
<
initguid.h
>
#include
"
DosHere.h
"

#include
"
DosHere_i.c
"
#include
"
OpenDos.h
"


CComModule _Module;

BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_OpenDos, COpenDos)
END_OBJECT_MAP()


/**/
/////
//
DLL Entry Point
extern
"
C
"

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID
/**/
/*lpReserved*/
)

...
{
if (dwReason == DLL_PROCESS_ATTACH)

...{
_Module.Init(ObjectMap, hInstance, &LIBID_DOSHERELib);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}


/**/
/////
//
Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(
void
)

...
{
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
}


/**/
/////
//
Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID
*
ppv)

...
{
return _Module.GetClassObject(rclsid, riid, ppv);
}

/**/
/////
//
DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(
void
)

...
{
// registers object, typelib and all interfaces in typelib
return _Module.RegisterServer(FALSE););//注意改为FALSE了

}


/**/
/////
//
DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(
void
)

...
{
return _Module.UnregisterServer(FALSE);//注意改为FALSE了
}




rgs文件内容:
HKCR

...
{
NoRemove CLSID

...{

ForceRemove ...{F617AA3A-D9A7-4B09-AF59-6E036732FCD8} = s 'InterFaceCls Class'

...{
InprocServer32 = s '%MODULE%'

...{
val ThreadingModel = s 'Apartment'
}
}
}

NoRemove Directory

...{
NoRemove shellex

...{
NoRemove ContextMenuHandlers

...{
ForceRemove OpenDosHere = s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
}
}
}

NoRemove Folder

...{
NoRemove shellex

...{
NoRemove ContextMenuHandlers

...{
ForceRemove OpenDosHere = s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
}
}
}


NoRemove Drive

...{
NoRemove shellex

...{
NoRemove ContextMenuHandlers

...{
ForceRemove OpenDosHere = s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
}
}
}

NoRemove Directory

...{
NoRemove Background

...{
NoRemove shellex

...{
NoRemove ContextMenuHandlers

...{
ForceRemove OpenDosHere = s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
}
}
}
}

}