1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for SwitchToThisWindow 5 * PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 6 */ 7 8 #include "precomp.h" 9 10 static const WCHAR s_szClassName[] = L"SwitchTest"; 11 12 static BOOL s_bTracing = FALSE; 13 14 static INT s_nWM_SYSCOMMAND_SC_RESTORE = 0; 15 static INT s_nWM_SYSCOMMAND_NOT_SC_RESTORE = 0; 16 static INT s_nWM_NCACTIVATE = 0; 17 static INT s_nWM_WINDOWPOSCHANGING = 0; 18 static INT s_nWM_ACTIVATE = 0; 19 20 #define TIMER_INTERVAL 200 21 22 static const char * 23 DumpInSMEX(void) 24 { 25 static char s_buf[128]; 26 DWORD dwRet = InSendMessageEx(NULL); 27 if (dwRet == ISMEX_NOSEND) 28 { 29 strcpy(s_buf, "ISMEX_NOSEND,"); 30 return s_buf; 31 } 32 s_buf[0] = 0; 33 if (dwRet & ISMEX_CALLBACK) 34 strcat(s_buf, "ISMEX_CALLBACK,"); 35 if (dwRet & ISMEX_NOTIFY) 36 strcat(s_buf, "ISMEX_NOTIFY,"); 37 if (dwRet & ISMEX_REPLIED) 38 strcat(s_buf, "ISMEX_REPLIED,"); 39 if (dwRet & ISMEX_SEND) 40 strcat(s_buf, "ISMEX_SEND,"); 41 return s_buf; 42 } 43 44 static void 45 DoMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 46 { 47 if (uMsg == WM_TIMER || !s_bTracing) 48 return; 49 50 trace("%s: uMsg:0x%04X, wParam:0x%08lX, lParam:0x%08lX, ISMEX_:%s\n", 51 (InSendMessage() ? "S" : "P"), uMsg, (LONG)wParam, (LONG)lParam, 52 DumpInSMEX()); 53 54 if (uMsg == WM_SYSCOMMAND) // 0x0112 55 { 56 ok(InSendMessageEx(NULL) == ISMEX_NOSEND, 57 "InSendMessageEx(NULL) was 0x%08lX\n", InSendMessageEx(NULL)); 58 if (wParam == SC_RESTORE) 59 ++s_nWM_SYSCOMMAND_SC_RESTORE; 60 else 61 ++s_nWM_SYSCOMMAND_NOT_SC_RESTORE; 62 } 63 64 if (uMsg == WM_NCACTIVATE) // 0x0086 65 { 66 ok(InSendMessageEx(NULL) == ISMEX_NOSEND, 67 "InSendMessageEx(NULL) was 0x%08lX\n", InSendMessageEx(NULL)); 68 ++s_nWM_NCACTIVATE; 69 } 70 71 if (uMsg == WM_WINDOWPOSCHANGING) // 0x0046 72 { 73 ok(InSendMessageEx(NULL) == ISMEX_NOSEND, 74 "InSendMessageEx(NULL) was 0x%08lX\n", InSendMessageEx(NULL)); 75 ++s_nWM_WINDOWPOSCHANGING; 76 } 77 78 if (uMsg == WM_ACTIVATE) // 0x0006 79 { 80 ok(InSendMessageEx(NULL) == ISMEX_NOSEND, 81 "InSendMessageEx(NULL) was 0x%08lX\n", InSendMessageEx(NULL)); 82 ++s_nWM_ACTIVATE; 83 } 84 } 85 86 // WM_TIMER 87 static void 88 OnTimer(HWND hwnd, UINT id) 89 { 90 KillTimer(hwnd, id); 91 switch (id) 92 { 93 // 94 // SwitchToThisWindow(TRUE) 95 // 96 case 0: // minimize 97 SetForegroundWindow(GetDesktopWindow()); 98 SetActiveWindow(GetDesktopWindow()); 99 ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n"); 100 ok(GetActiveWindow() == NULL, "GetActiveWindow() != NULL\n"); 101 ok(GetFocus() == NULL, "GetFocus() != NULL\n"); 102 CloseWindow(hwnd); // minimize 103 break; 104 case 1: // start tracing 105 ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n"); 106 ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n"); 107 ok(GetFocus() == NULL, "GetFocus() != NULL\n"); 108 s_nWM_SYSCOMMAND_SC_RESTORE = 0; 109 s_nWM_SYSCOMMAND_NOT_SC_RESTORE = 0; 110 s_nWM_NCACTIVATE = 0; 111 s_nWM_WINDOWPOSCHANGING = 0; 112 s_nWM_ACTIVATE = 0; 113 s_bTracing = TRUE; 114 SwitchToThisWindow(hwnd, TRUE); 115 trace("SwitchToThisWindow(TRUE): tracing...\n"); 116 break; 117 case 2: // tracing done 118 s_bTracing = FALSE; 119 trace("SwitchToThisWindow(TRUE): tracing done\n"); 120 ok(GetForegroundWindow() == hwnd, "GetForegroundWindow() != hwnd\n"); 121 ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n"); 122 ok(GetFocus() == hwnd, "GetFocus() != hwnd\n"); 123 ok(s_nWM_SYSCOMMAND_SC_RESTORE == 1, "WM_SYSCOMMAND SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_SC_RESTORE); 124 ok(!s_nWM_SYSCOMMAND_NOT_SC_RESTORE, "WM_SYSCOMMAND non-SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_NOT_SC_RESTORE); 125 ok(s_nWM_NCACTIVATE == 1, "WM_NCACTIVATE: %d\n", s_nWM_NCACTIVATE); 126 ok(s_nWM_WINDOWPOSCHANGING == 2, "WM_WINDOWPOSCHANGING: %d\n", s_nWM_WINDOWPOSCHANGING); 127 ok(s_nWM_ACTIVATE == 1, "WM_ACTIVATE: %d\n", s_nWM_ACTIVATE); 128 break; 129 // 130 // SwitchToThisWindow(FALSE) 131 // 132 case 3: // minimize 133 SetForegroundWindow(GetDesktopWindow()); 134 SetActiveWindow(GetDesktopWindow()); 135 ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n"); 136 ok(GetActiveWindow() == NULL, "GetActiveWindow() != NULL\n"); 137 ok(GetFocus() == NULL, "GetFocus() != NULL\n"); 138 CloseWindow(hwnd); // minimize 139 break; 140 case 4: // start tracing 141 ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n"); 142 ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n"); 143 ok(GetFocus() == NULL, "GetFocus() != NULL\n"); 144 s_nWM_SYSCOMMAND_SC_RESTORE = 0; 145 s_nWM_SYSCOMMAND_NOT_SC_RESTORE = 0; 146 s_nWM_NCACTIVATE = 0; 147 s_nWM_WINDOWPOSCHANGING = 0; 148 s_nWM_ACTIVATE = 0; 149 s_bTracing = TRUE; 150 SwitchToThisWindow(hwnd, FALSE); 151 trace("SwitchToThisWindow(FALSE): tracing...\n"); 152 break; 153 case 5: // tracing done 154 s_bTracing = FALSE; 155 trace("SwitchToThisWindow(FALSE): tracing done\n"); 156 ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n"); 157 ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n"); 158 ok(GetFocus() == NULL, "GetFocus() != NULL\n"); 159 ok(!s_nWM_SYSCOMMAND_SC_RESTORE, "WM_SYSCOMMAND SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_SC_RESTORE); 160 ok(!s_nWM_SYSCOMMAND_NOT_SC_RESTORE, "WM_SYSCOMMAND non-SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_NOT_SC_RESTORE); 161 ok(!s_nWM_NCACTIVATE, "WM_NCACTIVATE: %d\n", s_nWM_NCACTIVATE); 162 ok(!s_nWM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING: %d\n", s_nWM_WINDOWPOSCHANGING); 163 ok(!s_nWM_ACTIVATE, "WM_ACTIVATE: %d\n", s_nWM_ACTIVATE); 164 break; 165 default: // finish 166 DestroyWindow(hwnd); 167 return; 168 } 169 SetTimer(hwnd, id + 1, TIMER_INTERVAL, NULL); 170 } 171 172 static LRESULT CALLBACK 173 WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 174 { 175 DoMessage(hwnd, uMsg, wParam, lParam); 176 switch (uMsg) 177 { 178 case WM_CREATE: 179 SetTimer(hwnd, 0, TIMER_INTERVAL, NULL); 180 break; 181 case WM_TIMER: 182 OnTimer(hwnd, (UINT)wParam); 183 break; 184 case WM_DESTROY: 185 PostQuitMessage(0); 186 break; 187 default: 188 return DefWindowProc(hwnd, uMsg, wParam, lParam); 189 } 190 return 0; 191 } 192 193 START_TEST(SwitchToThisWindow) 194 { 195 WNDCLASSW wc; 196 HICON hIcon; 197 HCURSOR hCursor; 198 ATOM atom; 199 HWND hwnd; 200 MSG msg; 201 202 hIcon = LoadIcon(NULL, IDI_APPLICATION); 203 ok(hIcon != NULL, "hIcon was NULL\n"); 204 hCursor = LoadCursor(NULL, IDC_ARROW); 205 ok(hCursor != NULL, "hCursor was NULL\n"); 206 207 ZeroMemory(&wc, sizeof(wc)); 208 wc.lpfnWndProc = WindowProc; 209 wc.hInstance = GetModuleHandleW(NULL); 210 wc.hIcon = hIcon; 211 wc.hCursor = hCursor; 212 wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); 213 wc.lpszClassName = s_szClassName; 214 atom = RegisterClassW(&wc); 215 ok(atom != 0, "RegisterClassW failed\n"); 216 217 if (!atom) 218 { 219 skip("atom is zero\n"); 220 DestroyIcon(hIcon); 221 DestroyCursor(hCursor); 222 return; 223 } 224 225 hwnd = CreateWindowW(s_szClassName, L"SwitchToThisWindow", WS_OVERLAPPEDWINDOW, 226 CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, 227 NULL, NULL, GetModuleHandleW(NULL), NULL); 228 ok(hwnd != NULL, "CreateWindowW failed\n"); 229 trace("hwnd: %p\n", hwnd); 230 231 if (!hwnd) 232 { 233 skip("hwnd is NULL\n"); 234 UnregisterClassW(s_szClassName, GetModuleHandleW(NULL)); 235 DestroyIcon(hIcon); 236 DestroyCursor(hCursor); 237 return; 238 } 239 240 ShowWindow(hwnd, SW_SHOWNORMAL); 241 UpdateWindow(hwnd); 242 243 while (GetMessage(&msg, NULL, 0, 0)) 244 { 245 TranslateMessage(&msg); 246 DispatchMessage(&msg); 247 } 248 249 UnregisterClassW(s_szClassName, GetModuleHandleW(NULL)); 250 DestroyIcon(hIcon); 251 DestroyCursor(hCursor); 252 } 253