1 #pragma once
2 
3 #include <shlwapi.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <strsafe.h>
7 
8 #define MAIN_CLASSNAME   L"SHChangeNotify main window"
9 #define SUB_CLASSNAME    L"SHChangeNotify sub-window"
10 
11 #define WM_SHELL_NOTIFY     (WM_USER + 100)
12 
13 #define NUM_STAGE 10
14 
15 static inline BOOL FindSubProgram(LPWSTR pszSubProgram, DWORD cchSubProgram)
16 {
17     GetModuleFileNameW(NULL, pszSubProgram, cchSubProgram);
18     PathRemoveFileSpecW(pszSubProgram);
19     PathAppendW(pszSubProgram, L"shell32_apitest_sub.exe");
20 
21     if (!PathFileExistsW(pszSubProgram))
22     {
23         PathRemoveFileSpecW(pszSubProgram);
24         PathAppendW(pszSubProgram, L"testdata\\shell32_apitest_sub.exe");
25 
26         if (!PathFileExistsW(pszSubProgram))
27             return FALSE;
28     }
29 
30     return TRUE;
31 }
32 
33 static inline HWND DoWaitForWindow(LPCWSTR clsname, LPCWSTR text, BOOL bClosing, BOOL bForce)
34 {
35     HWND hwnd = NULL;
36     for (INT i = 0; i < 50; ++i)
37     {
38         hwnd = FindWindowW(clsname, text);
39         if (bClosing)
40         {
41             if (!hwnd)
42                 break;
43 
44             if (bForce)
45                 PostMessage(hwnd, WM_CLOSE, 0, 0);
46         }
47         else
48         {
49             if (hwnd)
50                 break;
51         }
52 
53         Sleep(1);
54     }
55     return hwnd;
56 }
57