方法一。
这种方式无法监视到文件的修改,只有右键属性中修改文件的操作才能监视到。
注册
BOOL Register(HWND hWnd)
{
SHChangeNotifyEntry pfsne;
LPITEMIDLIST pidl;
if(NOERROR == SHGetSpecialFolderLocation(hWnd,CSIDL_DESKTOP,&pidl))
pfsne.pidl=pidl;
pfsne.fRecursive = TRUE;
if(m_dwSHNotify == 0)
{
m_dwSHNotify = SHChangeNotifyRegister(hWnd,
SHCNE_DISKEVENTS,
SHCNE_ALLEVENTS,
WM_FILEMONITOR,
1,
&pfsne);
}
return TRUE;
}
反注册
BOOL Unregister()
{
SHChangeNotifyDeregister(m_dwSHNotify);
m_dwSHNotify = 0;
return TRUE;
}
自定义消息
#define WM_FILEMONITOR WM_USER+100
数据结构定义
typedef struct
{
DWORD dwItem1;
DWORD dwItem2;
}SHNOTIFYSTRUCT;
头文件中
afx_msg LONG OnFileMonitor(WPARAM wParam,LPARAM lParam);
cpp文件中
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
ON_MESSAGE(WM_FILEMONITOR, OnFileMonitor) //添加
END_MESSAGE_MAP()
//文件监控 ,自定义消息的处理函数
LONG CXXDlg::OnFileMonitor(WPARAM wParam,LPARAM lParam)
{
SHNOTIFYSTRUCT *pNotify = (SHNOTIFYSTRUCT *)wParam;
TCHAR szFileName[MAX_PATH*10], szNewFileName[MAX_PATH*10];
TCHAR szPath[MAX_PATH],szNewPath[MAX_PATH];
SHFILEINFO shFileInfo;
memset(szFileName,0,MAX_PATH*10);
memset(szPath,0,MAX_PATH);
memset(szNewFileName,0,MAX_PATH*10);
memset(szNewPath,0,MAX_PATH);
if(pNotify->dwItem1)
{
SHGetFileInfo((TCHAR*)pNotify->dwItem1,0,&shFileInfo,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_DISPLAYNAME);
SHGetPathFromIDList((struct _ITEMIDLIST *)pNotify->dwItem1,szPath);
wsprintf(szFileName,_T("Path:%s Name:%s "), szPath,shFileInfo.szDisplayName);
// MessageBox(szFileName);
}
if(pNotify->dwItem2)
{
SHGetFileInfo((TCHAR*)pNotify->dwItem2,0,&shFileInfo,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_DISPLAYNAME);
SHGetPathFromIDList((struct _ITEMIDLIST *)pNotify->dwItem2,szNewPath); //LPCITEMIDLIST
wsprintf(szNewFileName,_T("Path:%s Name:%s "), szNewPath,shFileInfo.szDisplayName);
//MessageBox(szNewFileName);
}
switch(lParam)
{
case SHCNE_RENAMEITEM: //改名
break;
case SHCNE_CREATE: //创建
break;
case SHCNE_DELETE: //删除
break;
case SHCNE_MKDIR : //创建目录
break;
case SHCNE_RMDIR : //移除目录
break;
case SHCNE_RENAMEFOLDER:
break;
case SHCNE_ATTRIBUTES : //改变
break;
}
return 0;
}
//方法二
ReadDirectoryChangesW
用多线程监视,如果是监视U盘,导致U盘无法拔下