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