1 #pragma once 2 3 #include <shlwapi.h> 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <strsafe.h> 7 8 #define TEMP_FILE L"shell-notify-temporary.txt" 9 #define CLASSNAME L"SHChangeNotify testcase window" 10 #define EVENT_NAME L"SHChangeNotify testcase event" 11 12 #define WM_SHELL_NOTIFY (WM_USER + 100) 13 #define WM_GET_NOTIFY_FLAGS (WM_USER + 101) 14 #define WM_CLEAR_FLAGS (WM_USER + 102) 15 #define WM_SET_PATHS (WM_USER + 103) 16 17 typedef enum TYPE 18 { 19 TYPE_RENAMEITEM, 20 TYPE_CREATE, 21 TYPE_DELETE, 22 TYPE_MKDIR, 23 TYPE_RMDIR, 24 TYPE_RENAMEFOLDER, 25 TYPE_UPDATEDIR, 26 TYPE_MAX = TYPE_UPDATEDIR 27 } TYPE; 28 29 typedef enum DIRTYPE 30 { 31 DIRTYPE_NULL = 0, 32 DIRTYPE_DESKTOP, 33 DIRTYPE_MYCOMPUTER, 34 DIRTYPE_MYDOCUMENTS 35 } DIRTYPE; 36 37 inline LPITEMIDLIST DoGetPidl(DIRTYPE iDir) 38 { 39 LPITEMIDLIST ret = NULL; 40 41 switch (iDir) 42 { 43 case DIRTYPE_NULL: 44 break; 45 46 case DIRTYPE_DESKTOP: 47 SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ret); 48 break; 49 50 case DIRTYPE_MYCOMPUTER: 51 SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &ret); 52 break; 53 54 case DIRTYPE_MYDOCUMENTS: 55 SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &ret); 56 break; 57 } 58 59 return ret; 60 } 61 62 static inline LPWSTR DoGetDir(DIRTYPE iDir) 63 { 64 static size_t s_index = 0; 65 static WCHAR s_pathes[3][MAX_PATH]; 66 LPWSTR psz = s_pathes[s_index]; 67 LPITEMIDLIST pidl = DoGetPidl(iDir); 68 psz[0] = 0; 69 SHGetPathFromIDListW(pidl, psz); 70 CoTaskMemFree(pidl); 71 s_index = (s_index + 1) % _countof(s_pathes); 72 return psz; 73 } 74 75 static inline HWND DoWaitForWindow(LPCWSTR clsname, LPCWSTR text, BOOL bClosing, BOOL bForce) 76 { 77 HWND hwnd = NULL; 78 for (INT i = 0; i < 50; ++i) 79 { 80 hwnd = FindWindowW(clsname, text); 81 if (bClosing) 82 { 83 if (!hwnd) 84 break; 85 86 if (bForce) 87 PostMessage(hwnd, WM_CLOSE, 0, 0); 88 } 89 else 90 { 91 if (hwnd) 92 break; 93 } 94 95 Sleep(1); 96 } 97 return hwnd; 98 } 99