ReactOS 0.4.16-dev-1537-g4e425b5
ShowWindow.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Tests for ShowWindow
5 * COPYRIGHT: Copyright 2021-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "precomp.h"
9#include <versionhelpers.h>
10
11typedef struct TEST_ENTRY
12{
13 INT lineno;
14 BOOL ret;
19
20static const CHAR s_name[] = "ShowWindow test window";
21
22static void DoTestEntry(const TEST_ENTRY *pEntry)
23{
24 HWND hwnd;
26 BOOL ret;
27
31 ok(!!hwnd, "Line %d: CreateWindowA failed\n", pEntry->lineno);
32
33 ret = !!ShowWindow(hwnd, pEntry->nCmdShow);
34 ok(ret == pEntry->ret, "Line %d: ShowWindow returned %s\n", pEntry->lineno,
35 (ret ? "non-zero" : "zero"));
36
38 ok(style == pEntry->style1, "Line %d: style was 0x%lX\n", pEntry->lineno, style);
39
41}
42
43#define STYLE_0 WS_OVERLAPPEDWINDOW
44#define STYLE_1 (WS_OVERLAPPEDWINDOW | WS_MAXIMIZE)
45#define STYLE_2 (WS_OVERLAPPEDWINDOW | WS_MINIMIZE)
46#define STYLE_3 (WS_OVERLAPPEDWINDOW | WS_VISIBLE)
47#define STYLE_4 (WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MAXIMIZE)
48#define STYLE_5 (WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MINIMIZE)
49
50#define SW_0 -1
51#define SW_1 SW_HIDE
52#define SW_2 SW_MAXIMIZE
53#define SW_3 SW_MINIMIZE
54#define SW_4 SW_RESTORE
55#define SW_5 SW_SHOW
56#define SW_6 SW_SHOWDEFAULT
57#define SW_7 SW_SHOWMAXIMIZED
58#define SW_8 SW_SHOWMINIMIZED
59#define SW_9 SW_SHOWMINNOACTIVE
60#define SW_10 SW_SHOWNA
61#define SW_11 SW_SHOWNOACTIVATE
62#define SW_12 SW_SHOWNORMAL
63
64static const TEST_ENTRY s_entries[] =
65{
66 // STYLE_0
67 { __LINE__, FALSE, SW_0, STYLE_0, STYLE_0 | WS_CLIPSIBLINGS },
68 { __LINE__, FALSE, SW_1, STYLE_0, STYLE_0 | WS_CLIPSIBLINGS },
80 // STYLE_1
81 { __LINE__, FALSE, SW_0, STYLE_1, STYLE_1 | WS_CLIPSIBLINGS },
82 { __LINE__, FALSE, SW_1, STYLE_1, STYLE_1 | WS_CLIPSIBLINGS },
85 { __LINE__, FALSE, SW_4, STYLE_1, STYLE_3 | WS_CLIPSIBLINGS },
87 { __LINE__, FALSE, SW_6, STYLE_1, STYLE_3 | WS_CLIPSIBLINGS },
92 { __LINE__, FALSE, SW_11, STYLE_1, STYLE_3 | WS_CLIPSIBLINGS },
93 { __LINE__, FALSE, SW_12, STYLE_1, STYLE_3 | WS_CLIPSIBLINGS },
94 // STYLE_2
95 { __LINE__, FALSE, SW_0, STYLE_2, STYLE_2 | WS_CLIPSIBLINGS },
96 { __LINE__, FALSE, SW_1, STYLE_2, STYLE_2 | WS_CLIPSIBLINGS },
99 { __LINE__, FALSE, SW_4, STYLE_2, STYLE_3 | WS_CLIPSIBLINGS },
101 { __LINE__, FALSE, SW_6, STYLE_2, STYLE_3 | WS_CLIPSIBLINGS },
103 { __LINE__, FALSE, SW_8, STYLE_2, STYLE_2 | WS_VISIBLE | WS_CLIPSIBLINGS },
104 { __LINE__, FALSE, SW_9, STYLE_2, STYLE_2 | WS_VISIBLE | WS_CLIPSIBLINGS },
106 { __LINE__, FALSE, SW_11, STYLE_2, STYLE_3 | WS_CLIPSIBLINGS },
107 { __LINE__, FALSE, SW_12, STYLE_2, STYLE_3 | WS_CLIPSIBLINGS },
108 // STYLE_3
109 { __LINE__, FALSE, SW_0, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
111 { __LINE__, TRUE, SW_2, STYLE_3, STYLE_3 | WS_MAXIMIZE | WS_CLIPSIBLINGS },
112 { __LINE__, TRUE, SW_3, STYLE_3, STYLE_3 | WS_MINIMIZE | WS_CLIPSIBLINGS },
113 { __LINE__, TRUE, SW_4, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
114 { __LINE__, TRUE, SW_5, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
115 { __LINE__, TRUE, SW_6, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
116 { __LINE__, TRUE, SW_7, STYLE_3, STYLE_3 | WS_MAXIMIZE | WS_CLIPSIBLINGS },
117 { __LINE__, TRUE, SW_8, STYLE_3, STYLE_3 | WS_MINIMIZE | WS_CLIPSIBLINGS },
118 { __LINE__, TRUE, SW_9, STYLE_3, STYLE_3 | WS_MINIMIZE | WS_CLIPSIBLINGS },
119 { __LINE__, TRUE, SW_10, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
120 { __LINE__, TRUE, SW_11, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
121 { __LINE__, TRUE, SW_12, STYLE_3, STYLE_3 | WS_CLIPSIBLINGS },
122 // STYLE_4
123 { __LINE__, FALSE, SW_0, STYLE_4, STYLE_4 | WS_CLIPSIBLINGS },
125 { __LINE__, TRUE, SW_2, STYLE_4, STYLE_4 | WS_MAXIMIZE | WS_CLIPSIBLINGS },
126 { __LINE__, TRUE, SW_3, STYLE_4, STYLE_3 | WS_MINIMIZE | WS_CLIPSIBLINGS },
127 { __LINE__, TRUE, SW_4, STYLE_4, STYLE_3 | WS_CLIPSIBLINGS },
128 { __LINE__, TRUE, SW_5, STYLE_4, STYLE_4 | WS_CLIPSIBLINGS },
129 { __LINE__, TRUE, SW_6, STYLE_4, STYLE_3 | WS_CLIPSIBLINGS },
130 { __LINE__, TRUE, SW_7, STYLE_4, STYLE_4 | WS_MAXIMIZE | WS_CLIPSIBLINGS },
131 { __LINE__, TRUE, SW_8, STYLE_4, STYLE_3 | WS_MINIMIZE | WS_CLIPSIBLINGS },
132 { __LINE__, TRUE, SW_9, STYLE_4, STYLE_3 | WS_MINIMIZE | WS_CLIPSIBLINGS },
133 { __LINE__, TRUE, SW_10, STYLE_4, STYLE_4 | WS_CLIPSIBLINGS },
134 { __LINE__, TRUE, SW_11, STYLE_4, STYLE_3 | WS_CLIPSIBLINGS },
135 { __LINE__, TRUE, SW_12, STYLE_4, STYLE_3 | WS_CLIPSIBLINGS },
136 // STYLE_5
137 { __LINE__, FALSE, SW_0, STYLE_5, STYLE_5 | WS_CLIPSIBLINGS },
139 { __LINE__, TRUE, SW_2, STYLE_5, STYLE_3 | WS_MAXIMIZE | WS_CLIPSIBLINGS },
140 { __LINE__, TRUE, SW_3, STYLE_5, STYLE_5 | WS_CLIPSIBLINGS },
141 { __LINE__, TRUE, SW_4, STYLE_5, STYLE_3 | WS_CLIPSIBLINGS },
142 { __LINE__, TRUE, SW_5, STYLE_5, STYLE_5 | WS_CLIPSIBLINGS },
143 { __LINE__, TRUE, SW_6, STYLE_5, STYLE_3 | WS_CLIPSIBLINGS },
144 { __LINE__, TRUE, SW_7, STYLE_5, STYLE_3 | WS_MAXIMIZE | WS_CLIPSIBLINGS },
145 { __LINE__, TRUE, SW_8, STYLE_5, STYLE_5 | WS_CLIPSIBLINGS },
146 { __LINE__, TRUE, SW_9, STYLE_5, STYLE_5 | WS_CLIPSIBLINGS },
147 { __LINE__, TRUE, SW_10, STYLE_5, STYLE_5 | WS_CLIPSIBLINGS },
148 { __LINE__, TRUE, SW_11, STYLE_5, STYLE_3 | WS_CLIPSIBLINGS },
149 { __LINE__, TRUE, SW_12, STYLE_5, STYLE_3 | WS_CLIPSIBLINGS },
150};
151
152static LRESULT CALLBACK
154{
155 switch (uMsg)
156 {
157 case WM_CREATE:
158 return 0;
159 case WM_DESTROY:
161 break;
162 default:
163 return DefWindowProcA(hwnd, uMsg, wParam, lParam);
164 }
165 return 0;
166}
167
169{
170 WNDCLASSA wc;
171 UINT iTest;
172
173 ZeroMemory(&wc, sizeof(wc));
176 wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
178 ok_int(1, !!RegisterClassA(&wc));
179
180 for (iTest = 0; iTest < _countof(s_entries); ++iTest)
181 {
182 DoTestEntry(&s_entries[iTest]);
183 }
184}
185
186#define RED RGB(255, 0, 0)
187
189{
190 HDC hDC = GetDC(NULL);
191 COLORREF color = GetPixel(hDC, 100, 100);
193 return color;
194}
195
196static DWORD WINAPI
198{
199 BOOL ret;
200 HWND hwnd = (HWND)arg;
201 DWORD style, exstyle;
202
203 Sleep(100);
205
208 Sleep(100);
209 ok(ret != FALSE, "ret was FALSE\n");
210 ok(CheckColor() != RED, "Color was red\n");
213 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP | WS_MINIMIZE | WS_VISIBLE), "style was 0x%08lX\n", style);
214 else
215 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP), "style was 0x%08lX\n", style);
217 ok_long(exstyle, 0);
218
220 Sleep(100);
221 ok(CheckColor() != RED, "Color was red\n");
222
225 Sleep(100);
226 ok(ret != FALSE, "ret was FALSE\n");
227 ok(CheckColor() != RED, "Color was red\n");
229 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP | WS_MINIMIZE | WS_VISIBLE), "style was 0x%08lX\n", style);
231 ok_long(exstyle, 0);
232
234 Sleep(100);
236
239 Sleep(100);
240 ok(ret != FALSE, "ret was FALSE\n");
241 ok(CheckColor() != RED, "Color was red\n");
244 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP | WS_MINIMIZE | WS_VISIBLE), "style was 0x%08lX\n", style);
245 else
246 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP), "style was 0x%08lX\n", style);
248 ok_long(exstyle, 0);
249
252 Sleep(100);
254 ok(ret != FALSE, "ret was FALSE\n");
255 else
256 ok_bool_false(ret, "Return was");
257 ok(CheckColor() != RED, "Color was red\n");
260 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP | WS_MINIMIZE | WS_VISIBLE), "style was 0x%08lX\n", style);
261 else
262 ok((style & (WS_POPUP | WS_MINIMIZE | WS_VISIBLE)) == (WS_POPUP), "style was 0x%08lX\n", style);
264 ok_long(exstyle, 0);
265
266 PostMessageW(hwnd, WM_CLOSE, 0, 0);
267 return 0;
268}
269
270static LRESULT CALLBACK
272{
273 switch (uMsg)
274 {
275 case WM_DESTROY:
277 break;
278 default:
279 return DefWindowProcW(hwnd, uMsg, wParam, lParam);
280 }
281 return 0;
282}
283
284static VOID
286{
287 WNDCLASSW wc;
288 HWND hwnd;
289 DWORD style;
293 MSG msg;
294
295 ZeroMemory(&wc, sizeof(wc));
297 wc.hInstance = hInstance;
300 wc.hbrBackground = hbr;
301 wc.lpszClassName = L"SW_FORCEMINIMIZE";
302 if (!RegisterClassW(&wc))
303 {
304 skip("RegisterClassW failed\n");
305 return;
306 }
307
309 hwnd = CreateWindowExW(0, L"SW_FORCEMINIMIZE", L"SW_FORCEMINIMIZE", style,
310 50, 50, 100, 100, NULL, NULL, hInstance, NULL);
311 if (!hwnd)
312 {
313 skip("CreateWindowExW failed\n");
314 return;
315 }
316
318 if (!hThread)
319 {
320 skip("CreateThread failed\n");
322 return;
323 }
325
326 while (GetMessageW(&msg, NULL, 0, 0))
327 {
330 }
331}
332
333static VOID
335{
336 HBRUSH hbr = CreateSolidBrush(RED);
338 DeleteObject(hbr);
339}
340
342{
345}
static HDC hDC
Definition: 3dtext.c:33
#define STYLE_3
Definition: ShowWindow.c:46
#define SW_1
Definition: ShowWindow.c:51
#define SW_10
Definition: ShowWindow.c:60
#define SW_12
Definition: ShowWindow.c:62
static VOID Test_ShowWindow_Main(VOID)
Definition: ShowWindow.c:168
#define SW_5
Definition: ShowWindow.c:55
static void DoTestEntry(const TEST_ENTRY *pEntry)
Definition: ShowWindow.c:22
static const CHAR s_name[]
Definition: ShowWindow.c:20
#define SW_7
Definition: ShowWindow.c:57
static const TEST_ENTRY s_entries[]
Definition: ShowWindow.c:64
static LRESULT CALLBACK ForceMinimizeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ShowWindow.c:271
#define SW_3
Definition: ShowWindow.c:53
#define SW_6
Definition: ShowWindow.c:56
#define SW_4
Definition: ShowWindow.c:54
#define STYLE_4
Definition: ShowWindow.c:47
#define SW_9
Definition: ShowWindow.c:59
static COLORREF CheckColor(VOID)
Definition: ShowWindow.c:188
#define STYLE_5
Definition: ShowWindow.c:48
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ShowWindow.c:153
#define RED
Definition: ShowWindow.c:186
#define SW_11
Definition: ShowWindow.c:61
#define SW_0
Definition: ShowWindow.c:50
#define STYLE_0
Definition: ShowWindow.c:43
static VOID Test_WS_FORCEMINIMIZE_Sub(HBRUSH hbr)
Definition: ShowWindow.c:285
#define STYLE_1
Definition: ShowWindow.c:44
#define SW_2
Definition: ShowWindow.c:52
#define STYLE_2
Definition: ShowWindow.c:45
#define SW_8
Definition: ShowWindow.c:58
static DWORD WINAPI ForceMinimizeThreadFunc(LPVOID arg)
Definition: ShowWindow.c:197
static VOID Test_WS_FORCEMINIMIZE()
Definition: ShowWindow.c:334
Arabic default style
Definition: afstyles.h:94
#define ok_bool_false(value, desc)
Definition: apitest.h:64
#define ok_long(expression, result)
Definition: atltest.h:133
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_int(expression, result)
Definition: atltest.h:134
#define msg(x)
Definition: auth_time.c:54
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
HINSTANCE hInstance
Definition: charmap.c:19
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
HANDLE HWND
Definition: compat.h:19
#define CALLBACK
Definition: compat.h:35
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
DWORD dwThreadId
Definition: fdebug.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
pKey DeleteObject()
GLuint color
Definition: glext.h:6243
static HDC
Definition: imagelist.c:88
unsigned int UINT
Definition: ndis.h:50
HANDLE hThread
Definition: wizard.c:28
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_MAXIMIZE
Definition: pedump.c:623
#define WS_POPUP
Definition: pedump.c:616
#define WS_MINIMIZE
Definition: pedump.c:622
#define WS_VISIBLE
Definition: pedump.c:620
long LONG
Definition: pedump.c:60
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define _countof(array)
Definition: sndvol32.h:70
Definition: cmd.c:13
INT lineno
Definition: fc.c:16
DWORD style1
Definition: ShowWindow.c:17
DWORD style0
Definition: ShowWindow.c:16
INT ret
Definition: fc.c:17
INT nCmdShow
Definition: ShowWindow.c:15
HBRUSH hbrBackground
Definition: winuser.h:3272
HINSTANCE hInstance
Definition: winuser.h:3269
LPCSTR lpszClassName
Definition: winuser.h:3274
WNDPROC lpfnWndProc
Definition: winuser.h:3266
LPCWSTR lpszClassName
Definition: winuser.h:3287
HBRUSH hbrBackground
Definition: winuser.h:3285
HICON hIcon
Definition: winuser.h:3283
HINSTANCE hInstance
Definition: winuser.h:3282
WNDPROC lpfnWndProc
Definition: winuser.h:3279
HCURSOR hCursor
Definition: winuser.h:3284
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
const uint16_t * PCWSTR
Definition: typedefs.h:57
int32_t INT
Definition: typedefs.h:58
#define WS_EX_MAKEVISIBLEWHENUNGHOSTED
Definition: undocuser.h:24
VERSIONHELPERAPI IsWindowsVistaOrGreater()
#define ZeroMemory
Definition: winbase.h:1753
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
DWORD COLORREF
Definition: windef.h:300
#define WINAPI
Definition: msvc.h:6
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
#define SW_SHOWNORMAL
Definition: winuser.h:781
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define WM_CLOSE
Definition: winuser.h:1649
#define GetWindowLongPtrW
Definition: winuser.h:4931
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4417
#define WM_CREATE
Definition: winuser.h:1636
#define SW_MINIMIZE
Definition: winuser.h:787
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
#define IDC_ARROW
Definition: winuser.h:695
#define GetWindowLongPtrA
Definition: winuser.h:4930
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2457
#define IDI_APPLICATION
Definition: winuser.h:712
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
#define SW_FORCEMINIMIZE
Definition: winuser.h:792
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
HDC WINAPI GetDC(_In_opt_ HWND)
#define CW_USEDEFAULT
Definition: winuser.h:225
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define WM_DESTROY
Definition: winuser.h:1637
#define SetWindowLongPtrW
Definition: winuser.h:5457
#define GWL_STYLE
Definition: winuser.h:863
BOOL WINAPI DestroyWindow(_In_ HWND)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2427
#define GWL_EXSTYLE
Definition: winuser.h:862
#define COLOR_3DFACE
Definition: winuser.h:940
char CHAR
Definition: xmlstorage.h:175