假設我們已經開了一個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 意見:
張貼留言