www.pudn.com > ShellMon.rar > main.cpp


//--------------------------------------------------------------------------- 
 
#include  
#pragma hdrstop  
 
#include "main.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TfrmMain *frmMain; 
//--------------------------------------------------------------------------- 
AnsiString __fastcall TfrmMain::SHEventName(AnsiString strPath1,AnsiString strPath2,DWORD lParam) 
{ 
        AnsiString sEvent; 
         
        switch(lParam)//根据参数设置提示消息 
        { 
                case SHCNE_RENAMEITEM:    sEvent = "重命名文件 ["+strPath1 + "] 为 [" + strPath2 + "]"; break; 
                case SHCNE_CREATE:        sEvent = "建立文件   ["+strPath1 + "]";break; 
                case SHCNE_DELETE:        sEvent = "删除文件   ["+strPath1 + "]";break; 
                case SHCNE_MKDIR:         sEvent = "新建目录   ["+strPath1 + "]";break; 
                case SHCNE_RMDIR:         sEvent = "删除目录   ["+strPath1 + "]";break; 
                case SHCNE_MEDIAINSERTED: sEvent = "[" + strPath1+"] 中插入可移动存储介质";break; 
                case SHCNE_MEDIAREMOVED:  sEvent = "[" + strPath1+"] 中移去可移动存储介质"+strPath1+" "+strPath2;break; 
                case SHCNE_DRIVEREMOVED:  sEvent = "移去驱动器 ["+strPath1+ "]";break; 
                case SHCNE_DRIVEADD:      sEvent = "添加驱动器 ["+strPath1+ "]";break; 
                case SHCNE_NETSHARE:      sEvent = "设置目录 ["+strPath1+"] 为共享";break; 
                case SHCNE_NETUNSHARE:    sEvent = "取消目录 ["+strPath1+"] 的共享"; break; 
                case SHCNE_ATTRIBUTES:    sEvent = "改变文件目录属性 ["+strPath1+ "]";break; 
                case SHCNE_UPDATEDIR:     sEvent = "更新目录 ["+strPath1+ "]";break; 
                case SHCNE_UPDATEITEM:    sEvent = "更新文件 ["+strPath1+ "]";break; 
                case SHCNE_SERVERDISCONNECT: sEvent = "断开与服务器的连接 ["+strPath1+"] ["+strPath2+ "]";break; 
                case SHCNE_UPDATEIMAGE:   sEvent = "执行:SHCNE_UPDATEIMAGE 操作";break; 
                case SHCNE_DRIVEADDGUI:   sEvent = "执行:SHCNE_DRIVEADDGUI 操作";break; 
                case SHCNE_RENAMEFOLDER:  sEvent = "重命名文件夹 ["+strPath1+"] 为 ["+strPath2+ "]";break; 
                case SHCNE_FREESPACE:     sEvent = "磁盘空间大小改变 ";break; 
                case SHCNE_ASSOCCHANGED:  sEvent = "改变文件关联";break; 
                case SHCNE_EXTENDED_EVENT:sEvent = "此目录有变化 [" + strPath2 + "]"; break; 
                default:                  sEvent = "未知操作 ["+IntToStr(lParam)+ "]";break; 
        } 
        return sEvent; 
} 
bool __fastcall TfrmMain::SHNotify_Register(HWND hWnd) 
{ 
        IDLSTRUCT ps; 
        if( m_hSHNotify != NULL) return False; 
         
        if( SHGetSpecialFolderLocation == NULL) return; 
 
        if( SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,&m_pidlDesktop) == NOERROR) 
        { 
                if( m_pidlDesktop ) 
                { 
                        ps.pidl = m_pidlDesktop; 
 
                        ps.bWatchSubFolders = 1; 
 
                        m_hSHNotify = SHChangeNotifyRegister(hWnd, 
                                        SHCNF_TYPE | SHCNF_IDLIST, 
                                        SHCNE_ALLEVENTS | SHCNE_INTERRUPT, 
                                        WM_SHNOTIFY,1,&ps); 
 
                        return True; 
 
                } 
                else 
                { 
                        CoTaskMemFree(m_pidlDesktop); 
                } 
        } 
        return False; 
} 
bool __fastcall TfrmMain::SHNotify_UnRegister() 
{ 
        if( m_hSHNotify == NULL) return False; 
        if( SHChangeNotifyDeregister == NULL) return False; 
 
        if( SHChangeNotifyDeregister(m_hSHNotify) ) 
        { 
                m_hSHNotify = NULL; 
                CoTaskMemFree(m_pidlDesktop); 
                return True; 
        } 
        return False; 
} 
 
 
__fastcall TfrmMain::TfrmMain(TComponent* Owner) 
        : TForm(Owner) 
{ 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TfrmMain::WMShellReg(TMessage & Message) 
{ 
        //TODO: Add your source code here 
        AnsiString strPath1; 
        AnsiString strPath2; 
        char strPath[256]; 
        AnsiString sTmp; 
        PSHNOTIFYSTRUCT pidlItem; 
 
        pidlItem = (PSHNOTIFYSTRUCT)Message.WParam; 
 
        SHGetPathFromIDList(pidlItem->dwItem1,strPath); 
        strPath1 = strPath; 
        SHGetPathFromIDList(pidlItem->dwItem2,strPath); 
        strPath2 = strPath; 
 
        sTmp = FormatDateTime("[yyyy-mm-dd hh:mm:ss]:",Now()) + SHEventName(strPath1,strPath2,Message.LParam); 
         
        Memo1->Lines->Add(sTmp); 
} 
void __fastcall TfrmMain::WMKeyLog(TMessage & Message) 
{ 
        //TODO: Add your source code here 
        Memo1->Lines->AddStrings(HookList); 
 
        HookList->Clear(); 
} 
void __fastcall TfrmMain::FormCreate(TObject *Sender) 
{ 
        m_hSHNotify = NULL; 
        HMODULE DLLHandle = LoadLibrary("SHELL32.DLL"); 
        if( DLLHandle ) 
        { 
                SHChangeNotifyRegister   = (SHNRegister)GetProcAddress(DLLHandle,(LPCSTR)2); 
                SHChangeNotifyDeregister = (SHNUnRegister)GetProcAddress(DLLHandle,(LPCSTR)4); 
        } 
        FreeLibrary(DLLHandle); 
         
        SHNotify_Register(Handle); 
 
        InstallHook(Handle); 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action) 
{ 
        SHNotify_UnRegister(); 
 
        UnInstallHook(); 
} 
//---------------------------------------------------------------------------