📄 denofilemonitorhook.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 + -