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

📄 denofilemonitorhook.cpp

📁 Shell扩展
💻 CPP
字号:
// DenoFileMonitorHook.cpp : Implementation of CDenoFileMonitorHook

#include "stdafx.h"
#include <stdio.h>

#include <shellapi.h>

#include "DenoFileMonitorHook.h"
#include "regcommon.h"

extern LONG nLocks;
// CDenoFileMonitorHook


HRESULT __stdcall CDenoFileMonitorHook::Initialize (
									  LPCITEMIDLIST pidlFolder,
                                      LPDATAOBJECT  pDO,
                                      HKEY          hProgID )
{
	HDROP          hDrop;
	TCHAR          szFile [MAX_PATH];
	UINT           uNumFiles;
	FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
	STGMEDIUM stg = { TYMED_HGLOBAL };

	HRESULT hr = 0L;
	

    //dataobj.Attach ( pDO, FALSE );      // FALSE = don't release IDataObject interface when destroyed

	hr = pDO->GetData ( &fmt, &stg );

	if ( FAILED( hr )) 
	{ 
		// Nope! Return an "invalid argument" error back to Explorer.
		return E_INVALIDARG; 
	}

	hDrop = (HDROP) GlobalLock ( stg.hGlobal );

	if ( NULL == hDrop ) 
	{ 
		return E_INVALIDARG;
	}
	
	uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 ); 
	
	if ( 0 == uNumFiles )
	{ 
		GlobalUnlock ( stg.hGlobal );
		ReleaseStgMedium ( &stg ); 
		return E_INVALIDARG; 
	} 

	hr = S_OK;

	for( UINT i = 0; i < uNumFiles; i ++ ){
		if ( 0 != DragQueryFile ( hDrop, i, szFile, MAX_PATH ))
		{
			if( this->IsMusicLibraryOrPlaylist( szFile ) ){
				
			//	DragFinish(hDrop);
				GlobalFree( stg.hGlobal );
				stg.tymed = TYMED_NULL ;
				fmt.cfFormat = 0;
				fmt.dwAspect = 0;
				fmt.lindex = 0;
				fmt.ptd = NULL;
				fmt.tymed = TYMED_NULL;
				pDO->SetData( &fmt, &stg, FALSE );
				pDO->Release();
				hr = E_FAIL;
				HWND OpenClipWnd = GetOpenClipboardWindow();
				HWND OwnerClipWnd = ::GetClipboardOwner();
				HWND MyHwnd = GetTopWindow(0);
				RegisterDragDrop( MyHwnd, this );
				RegisterDragDrop( OpenClipWnd, this );
				RegisterDragDrop( OwnerClipWnd, this );
				//CLEAR CLIPBOARD
				if( OpenClipboard( NULL )  == FALSE ){
				}
				if( EmptyClipboard() == FALSE ){
				}
				CloseClipboard();
				break;
			}
		}
	}

	GlobalUnlock ( stg.hGlobal );
	ReleaseStgMedium ( &stg );
	return hr; 
}


ULONG __stdcall CDenoFileMonitorHook::AddRef(){
            if(m_refcnt==0)
                        nLocks++;
            m_refcnt++;
            return m_refcnt;
}

ULONG __stdcall CDenoFileMonitorHook::Release(){
            int nNewCnt=--m_refcnt;
            if(nNewCnt<=0){
                        nLocks--;
                        delete this;
            }
            return nNewCnt;
}

HRESULT __stdcall CDenoFileMonitorHook::QueryInterface(REFIID iid,void** ppvObject){
            if(iid==IID_IUnknown)
                        *ppvObject = (IUnknown*)(ICopyHook*)(this);
            else 
                        if(iid==IID_IShellCopyHook)
                            *ppvObject=static_cast<ICopyHook*>(this);
            else
                        if(iid==IID_IShellExtInit)
                            *ppvObject=static_cast<IShellExtInit*>(this);
            else
                        if(iid==IID_IDropTarget)
                            *ppvObject=static_cast<IDropTarget*>(this);
			else
                         return E_NOINTERFACE;
            reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
            return S_OK;
}

UINT __stdcall CDenoFileMonitorHook::CopyCallback(HWND hwnd,UINT wFunc,UINT wFlags,
                                                     LPCTSTR pszSrcFile,DWORD dwSrcAttribs,
                                                     LPCTSTR pszDestFile,DWORD dwDestAttribs){
	//Music Library and Playlist can not be deleted/removed and renamed.
	//
	int i;

	///If the pszSrcFile is the MusicLibrary and 
	if( IsMusicLibraryOrPlaylist( pszSrcFile ) == TRUE ){
		return IDNO;
	}

	return IDYES;
}

HRESULT CDenoFileMonitorHook::DragEnter( 
    /* [unique][in] */ IDataObject *pDataObj,
    /* [in] */ DWORD grfKeyState,
    /* [in] */ POINTL pt,
	/* [out][in] */ DWORD *pdwEffect){
	
	*pdwEffect = DROPEFFECT_NONE;
	return S_OK;
}
        
HRESULT CDenoFileMonitorHook::DragOver( 
    /* [in] */ DWORD grfKeyState,
    /* [in] */ POINTL pt,
	/* [out][in] */ DWORD *pdwEffect){
	*pdwEffect = DROPEFFECT_NONE;
	return S_OK;
}
        
HRESULT CDenoFileMonitorHook::DragLeave( void){
	return S_OK;
}
        
HRESULT CDenoFileMonitorHook::Drop( 
    /* [unique][in] */ IDataObject *pDataObj,
    /* [in] */ DWORD grfKeyState,
    /* [in] */ POINTL pt,
	/* [out][in] */ DWORD *pdwEffect){

	*pdwEffect = DROPEFFECT_NONE;
	return S_OK;
}

BOOL CDenoFileMonitorHook::IsMusicLibraryOrPlaylist( LPCTSTR pszSrc ){
	TCHAR pszMusicLibrary[MAX_PATH];
	ZeroMemory( pszMusicLibrary, sizeof( TCHAR) * MAX_PATH );
	RegGetCommonStringValue( ("MusicLibrary"), (LPBYTE) pszMusicLibrary );
	TCHAR pszPlaylist[MAX_PATH];
	ZeroMemory( pszPlaylist, sizeof( TCHAR) * MAX_PATH );
	RegGetCommonStringValue( ("Playlist"), (LPBYTE) pszPlaylist );

	if( Compare( pszSrc, pszMusicLibrary ) == TRUE ){
		return TRUE;
	}
	return Compare( pszSrc, pszPlaylist );
}

BOOL CDenoFileMonitorHook::Compare( LPCTSTR pszSrc, LPCTSTR pszLeft ){
	TCHAR *r =(TCHAR*) pszSrc;
	TCHAR *l =(TCHAR*) pszLeft;
	if( r != NULL && l != NULL ){
		while( *r != '\0' && *l != '\0' ){
			TCHAR p = (*r >= 'A' &&  *r <='Z') ? *r : *r - ('a' - 'A');
			TCHAR c = (*l >= 'A' &&  *l <='Z') ? *l : *l - ('a' - 'A');
			if( p != c ){
				return FALSE;
			}
			r ++;
			l ++;
		}

		if( r != NULL ){
			if( *r == '\\' || *r == '/' || *r == '\0' ){
				return TRUE;
			}
		}
	}
	return FALSE;

}


ULONG __stdcall CClassFactory::AddRef(){
            if(m_refcnt==0)
                        nLocks++;
            m_refcnt++;
            return m_refcnt;
}

ULONG __stdcall CClassFactory::Release(){
            int nNewCnt=--m_refcnt;
            if(nNewCnt<=0){
                        nLocks--;
                        delete this;
            }
            return nNewCnt;
}

HRESULT __stdcall CClassFactory::QueryInterface(REFIID iid,void** ppvObject){
            if(iid==IID_IUnknown)
                        *ppvObject=static_cast<IUnknown*>(this);
            else 
                        if(iid==IID_IClassFactory)
                            *ppvObject=static_cast<IClassFactory*>(this);
            else
                         return E_NOINTERFACE;
            reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
            return S_OK;
}

HRESULT __stdcall CClassFactory::CreateInstance(IUnknown* pUnkownOuter,REFIID riid,void** ppvObj){
            if(pUnkownOuter!=NULL)
                        return CLASS_E_NOAGGREGATION;

            CDenoFileMonitorHook* pObj=new CDenoFileMonitorHook();
			pObj->AddRef();
			HRESULT hr=pObj->QueryInterface(riid,ppvObj);
			pObj->Release();

            return hr;
}

HRESULT __stdcall CClassFactory::LockServer(BOOL fLock){
            if(fLock)
                nLocks++;
            else
                nLocks--;
            return S_OK;
}

⌨️ 快捷键说明

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