作爲開發人員總是要時不時使用命令行,爲此用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工程
#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}'
}
}
}
}
}