假設我們已經開了一個winMobile專案,然後建立一個繼承CDialog的class:
class CFileChangeInfoDlg : public CDialog
{然後在class裡新增:
afx_msg LRESULT OnFileChangeInfo(WPARAM wParam, LPARAM lParam); // 文件監控
再來重載OnInitDialog,並在該函數加上以下:
// 啟動監控
std::wstring strPath = _T("\\My Documents\\我的圖片"); // 要監控的目錄
SHCHANGENOTIFYENTRY shcne = {0};
shcne.fRecursive = FALSE; // 只監控最上層
shcne.pszWatchDir = const_cast<LPTSTR>(strPath.c_str());
shcne.dwEventMask = SHCNE_ALLEVENTS ; // 所有Event都收
if ( !SHChangeNotifyRegister(GetSafeHwnd() , &shcne)) // 啟動監控
{
TRACE( _T("啟動監控失敗"));
}SHChangeNotifyRegister( HWND hwnd, SHCHANGENOTIFYENTRY *pshcne)需要代入兩個引數,第一個一看就知道是代handle,第二個是代入SHCHANGENOTIFYENTRY結構,來看一下SHCHANGENOTIFYENTRY是什麼東西:
typedef struct tagSHCHANGENOTIFYENTRY {
DWORD dwEventMask;
LPTSTR pszWatchDir;
BOOL fRecursive;
} SHCHANGENOTIFYENTRY;- dwEventMask:指定什麼時候會發送 WM_FILECHANGEINFO 訊息。
- pszWatchDir:指定要監控那個目錄。
- fRecursive:指定是否只監控指定目錄(flase)還是也監控裡面的子目錄(true)。
以上都完畢後,然後在BEGIN_MESSAGE_MAP加上:
BEGIN_MESSAGE_MAP(CFileChangeInfoDlg, CDialog) ON_MESSAGE(WM_FILECHANGEINFO, &CFileChangeInfoDlg::OnFileChangeInfo) END_MESSAGE_MAP()
然後再加上:
LRESULT CFileChangeInfoDlg::OnFileChangeInfo(WPARAM wParam, LPARAM lParam)
{
FILECHANGENOTIFY* pfcn = reinterpret_cast<FILECHANGENOTIFY*>(lParam); // 監控文件的操作
FILECHANGEINFO& fci = pfcn->fci;
if ((fci.uFlags & SHCNF_PATH) == true)
{
switch(fci.wEventId)
{
case SHCNE_CREATE:
{
AfxMessageBox( _T("Create!"));
}
break;
case SHCNE_RENAME:
{
AfxMessageBox( _T("Rename!"));
}
break;
case SHCNE_DELETE:
{
AfxMessageBox( _T("Delete!"));
}
break;
}
}
SHChangeNotifyFree(pfcn); // 先釋放,等待下次
return 0;
}在switch裡面就可以撰寫當檔案Create、Rename,或Delete時所做的處理了,另外,如果Mobile跟PC連線時,把檔案拉到要監控的目錄時,是屬於Rename的情況!不過如果是Mobile自己本身的copy&paste的話,就是Create了。
如果不想要監控了,再使用SHChangeNotifyDeregister(hWnd)即可!
0 意見:
張貼留言