⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getname.cpp

📁 这个程序主要是利用Explorer中右健菜单来Copy全文件
💻 CPP
字号:
//

#include "stdafx.h"
#include "CopyName.h"
#include "GetName.h"

#include "RegisterClass.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGetName
BOOL AFXAPI CopyStringToClipboard(LPCTSTR szStr);

IMPLEMENT_DYNCREATE(CGetName, CCmdTarget)

CGetName::CGetName()
{
	EnableAutomation();
	
	
	AfxOleLockApp();
}

CGetName::~CGetName()
{
	
	AfxOleUnlockApp();
}


void CGetName::OnFinalRelease()
{

//	CCmdTarget::OnFinalRelease();
	delete this;
}


BEGIN_MESSAGE_MAP(CGetName, CCmdTarget)
	//{{AFX_MSG_MAP(CGetName)
		// 
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(CGetName, CCmdTarget)
	//{{AFX_DISPATCH_MAP(CGetName)
		// 
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()


// {7ABA2FEC-05A0-11D2-8446-00A02491B6C9}
static const IID IID_IGetName =
{ 0x7aba2fec, 0x5a0, 0x11d2, { 0x84, 0x46, 0x0, 0xa0, 0x24, 0x91, 0xb6, 0xc9 } };

BEGIN_INTERFACE_MAP(CGetName, CCmdTarget)
	INTERFACE_PART(CGetName, IID_IGetName, Dispatch)

    INTERFACE_PART(CGetName, IID_IContextMenu, MenuExt)
    INTERFACE_PART(CGetName, IID_IShellExtInit, ShellInit)

END_INTERFACE_MAP()

// {7ABA2FED-05A0-11D2-8446-00A02491B6C9}
//IMPLEMENT_OLECREATE(CGetName, "CopyName.GetName", 0x7aba2fed, 0x5a0, 0x11d2, 0x84, 0x46, 0x0, 0xa0, 0x24, 0x91, 0xb6, 0xc9)

/////////////////////////////////////////////////////////////////////////////
// CGetName method Handle
IMPLEMENT_OLECREATE_EX(CGetName, "CopyFileName", 0x7aba2fed, 0x5a0, 0x11d2, 0x84, 0x46, 0x0, 0xa0, 0x24, 0x91, 0xb6, 0xc9)

STDMETHODIMP CGetName::XMenuExt::QueryInterface(REFIID riid, void** ppv)
{
    METHOD_PROLOGUE(CGetName, MenuExt);
    TRACE("CGetName::XMenuExt::QueryInterface\n");
    return pThis->ExternalQueryInterface(&riid, ppv);
}

STDMETHODIMP_(ULONG) CGetName::XMenuExt::AddRef(void)
{
    METHOD_PROLOGUE(CGetName, MenuExt);
    return pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CGetName::XMenuExt::Release(void)
{
    METHOD_PROLOGUE(CGetName, MenuExt);
    return pThis->ExternalRelease();
}

STDMETHODIMP CGetName::XMenuExt::QueryContextMenu( HMENU hmenu,UINT indexMenu,
    UINT idCmdFirst, UINT idCmdLast,UINT uFlags)
{

    ::InsertMenu(hmenu, indexMenu++, MF_STRING | MF_BYPOSITION,
        idCmdFirst + ID_NEWCMD, "Copy FileName");

    return ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_NULL, (USHORT)2));
}

STDMETHODIMP CGetName::XMenuExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
{
    METHOD_PROLOGUE(CGetName, MenuExt);
//    char szTest[MAX_PATH * 2];

    if (HIWORD(lpici->lpVerb ))
    {
        AfxMessageBox("E_FAIL");
        return E_FAIL;
    }

    if (LOWORD(lpici->lpVerb) > ID_NEWCMD)
    {
        AfxMessageBox("Invalid Arg");
        return E_INVALIDARG;
    }

    if (LOWORD(lpici->lpVerb) == ID_NEWCMD)
    {
		CopyStringToClipboard(pThis->m_szFileName);
//      wsprintf(szTest, "Context menu for file: %s", pThis->m_szFileName);
//      ::MessageBox(lpici->hwnd, szTest, "Context Menu Handler", MB_OK);
    }
    else
        ::MessageBox(lpici->hwnd, "ID != ID_NEWCMD", "Context Menu Handler", MB_OK);
        
    return NOERROR;
}

STDMETHODIMP CGetName::XMenuExt::GetCommandString(UINT idCmd,UINT uType,
    UINT* pwReserved,LPSTR pszName,UINT cchMax)
{
    if (idCmd > ID_NEWCMD)
        return ResultFromScode(E_INVALIDARG);

    if (idCmd == ID_NEWCMD)
        lstrcpy(pszName, "Context Menu Test");

    return NOERROR;
}

// IUnknown for IShellExtInit
STDMETHODIMP CGetName::XShellInit::QueryInterface(REFIID riid, void** ppv)
{
    METHOD_PROLOGUE(CGetName, ShellInit);
    TRACE("CGetName::XShellInit::QueryInterface\n");
    return pThis->ExternalQueryInterface(&riid, ppv);
}

STDMETHODIMP_(ULONG) CGetName::XShellInit::AddRef(void)
{
    METHOD_PROLOGUE(CGetName, ShellInit);
    return pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CGetName::XShellInit::Release(void)
{
    METHOD_PROLOGUE(CGetName, ShellInit);
    return pThis->ExternalRelease();
}

STDMETHODIMP CGetName::XShellInit::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdobj, HKEY hkeyProgID)
{
    METHOD_PROLOGUE(CGetName, ShellInit);
    TRACE("CGetName::XShellInit::Intialize\n");

    HRESULT hres = E_FAIL;
    FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
    STGMEDIUM medium;

    //
    //  no data object, we dont deal with that.
    //
    if (pdobj == NULL)
    {
	    TRACE("CGetName::XShellInit::Initialize() no data object");
	    return E_FAIL;
    }

    //
    //  use the given IDataObject to get a list of filenames (CF_HDROP)
    //
    hres = pdobj->GetData(&fmte, &medium);

    if (FAILED(hres))
    {
	    TRACE("CGetName::XShellInit::Initialize() cant get data");
	    return E_FAIL;
    }
    //
    // a HDROP can contain more than one file if the user selects
    // multiple files and brings up a context menu your handler
    // will be called.	not all files will be your type! only the
    // first one will be.  unless your handler can deal with
    // any file type, the best thing to do is to not
    // support HDROPs with more than one file.
    //
    if (DragQueryFile((HDROP)medium.hGlobal, (UINT)-1, NULL, 0) == 1)
    {
    	DragQueryFile((HDROP)medium.hGlobal, 0, pThis->m_szFileName, sizeof(pThis->m_szFileName));
	    hres = S_OK;
    }
    else
    	hres = E_FAIL;
 
    //
    //	release the data.
    //
    ReleaseStgMedium(&medium);

    return hres;
}

/*
BOOL CGetName::CGetNameFactory::UpdateRegistry(BOOL bRegister)
{
	return TRUE;
}
*/

BOOL CGetName::CGetNameFactory::UpdateRegistry(BOOL bRegister)
{
	//REFCLSID	
	CRegisterClass	reg(m_clsid,"CopyFileName");

	VERIFY(reg.AddSymbolAlias("*","*") == 3);
	VERIFY(reg.AddSymbolAlias("Directory","Directory") == 4);

	reg.AddEntry("CLSID\\%1\\InProcServer32","Apartment","ThreadingModel");
	reg.AddEntry("%4\\shellex\\ContextMenuHandlers\\%2","%1");
	reg.AddEntry("%5\\shellex\\ContextMenuHandlers\\%2","%1");

	if(bRegister)
	{
		COleObjectFactory::UpdateRegistry(TRUE);
		return reg.Register();
	}
	else
	{
		reg.Register(FALSE);

#ifdef _AFXDLL
		return AfxOleUnregisterClass(m_clsid,NULL);

#else
		reg.RemoveKey("CLSID\\%1");
		reg.RemoveKey("%2");
		return TRUE;
#endif
	}
}

BOOL AFXAPI CopyStringToClipboard(LPCTSTR szStr)
{
	
	HGLOBAL hData;
	LPVOID lpData;
	CString szTemp;
	LPSTR	sz;
	long	nSize;

	szTemp = szStr;
	nSize = szTemp.GetLength()+1;
	sz = szTemp.LockBuffer();
	hData = GlobalAlloc(GHND,nSize);
	if(hData == NULL || 
		(lpData = GlobalLock(hData)) ==NULL )
	{
		GlobalFree(hData);
		return FALSE;
	}
	lstrcpy((LPSTR)lpData,sz);
	GlobalUnlock(hData);
	szTemp.UnlockBuffer();

	if(OpenClipboard(NULL))
	{
		EmptyClipboard();
		SetClipboardData(CF_TEXT,hData);
		CloseClipboard();
	}
	GlobalUnlock(hData);
	GlobalFree(hData);
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -