1 /*
2  * enumwnd.c
3  *
4  * application to test the various Window Enumeration functions
5  */
6 
7 //#define WIN32_LEAN_AND_MEAN
8 #include <windows.h>
9 #include <tchar.h>
10 #include <stdio.h>
11 
12 HBRUSH hbrBackground;
13 HFONT tf;
14 int test = 0;
15 const TCHAR* APP_NAME = "EnumWnd Test";
16 const TCHAR* CLASS_NAME = "EnumWndTestClass";
17 
18 LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
19 
20 int WINAPI
21 WinMain(HINSTANCE hInstance,
22 	HINSTANCE hPrevInstance,
23 	LPSTR lpszCmdLine,
24 	int nCmdShow)
25 {
26   WNDCLASS wc;
27   MSG msg;
28   HWND hWnd;
29 
30   wc.lpszClassName = CLASS_NAME;
31   wc.lpfnWndProc = MainWndProc;
32   wc.style = CS_VREDRAW | CS_HREDRAW;
33   wc.hInstance = hInstance;
34   wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION);
35   wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW);
36   wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
37   wc.lpszMenuName = NULL;
38   wc.cbClsExtra = 0;
39   wc.cbWndExtra = 0;
40   if (RegisterClass(&wc) == 0)
41     {
42       _ftprintf ( stderr, _T("RegisterClass failed (last error 0x%lX)\n"),
43 	      GetLastError());
44       return(1);
45     }
46 
47   hWnd = CreateWindow(CLASS_NAME,
48 		      APP_NAME,
49 		      WS_OVERLAPPEDWINDOW,
50 		      0,
51 		      0,
52 		      CW_USEDEFAULT,
53 		      CW_USEDEFAULT,
54 		      NULL,
55 		      NULL,
56 		      hInstance,
57 		      NULL);
58   if (hWnd == NULL)
59     {
60       _ftprintf ( stderr, _T("CreateWindow failed (last error 0x%lX)\n"),
61 	      GetLastError());
62       return(1);
63     }
64 
65   tf = CreateFont (14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE,
66 		    ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
67 		    DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, _T("Timmons"));
68 
69   hbrBackground = CreateSolidBrush ( RGB(192,192,192) );
70 
71   ShowWindow ( hWnd, nCmdShow );
72 
73   while(GetMessage(&msg, NULL, 0, 0))
74   {
75     TranslateMessage(&msg);
76     DispatchMessage(&msg);
77   }
78 
79   DeleteObject(hbrBackground);
80 
81   DeleteObject(tf);
82 
83   return msg.wParam;
84 }
85 
86 void MyTextOut ( HDC hdc, int x, int y, const TCHAR* text )
87 {
88   TextOut ( hdc, x, y, text, _tcslen(text) );
89 }
90 
91 typedef struct _EnumData
92 {
93   HDC hdc;
94   int x;
95   int y;
96 } EnumData;
97 
98 BOOL CALLBACK MyWindowEnumProc ( HWND hwnd, LPARAM lParam )
99 {
100   TCHAR wndcaption[1024], buf[1024];
101   EnumData* ped = (EnumData*)lParam;
102   GetWindowText ( hwnd, wndcaption, sizeof(wndcaption)/sizeof(*wndcaption) );
103   _sntprintf ( buf, sizeof(buf)/sizeof(*buf), _T("%x - %s"), hwnd, wndcaption );
104   MyTextOut ( ped->hdc, ped->x, ped->y, buf );
105   ped->y += 13;
106   return TRUE;
107 }
108 
109 LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
110 {
111   PAINTSTRUCT ps;
112   HDC hDC;
113   RECT rect;
114   TCHAR buf[100];
115   EnumData ed;
116 
117   switch(msg)
118   {
119   case WM_PAINT:
120     hDC = BeginPaint(hWnd, &ps);
121     SelectObject(hDC, tf);
122 
123     GetClientRect ( hWnd, &rect );
124     FillRect ( hDC, &rect, hbrBackground );
125 
126     MyTextOut ( hDC, 10, 10, "EnumWnd Test" );
127 
128     _sntprintf ( buf, sizeof(buf)/sizeof(*buf), _T("My HWND: %x"), hWnd );
129     MyTextOut ( hDC, 10, 30, buf );
130 
131     ed.hdc = hDC;
132     ed.x = 10;
133     ed.y = 70;
134 
135     switch ( test )
136     {
137     case 1:
138       MyTextOut ( hDC, 10, 50, _T("Test #1: EnumWindows()") );
139       EnumWindows ( MyWindowEnumProc, (LPARAM)&ed );
140       break;
141     case 2:
142       MyTextOut ( hDC, 10, 50, _T("Test #2: EnumChildWindows()") );
143       EnumChildWindows ( hWnd, MyWindowEnumProc, (LPARAM)&ed );
144       break;
145     case 3:
146       MyTextOut ( hDC, 10, 50, _T("Test #3: EnumDesktopWindows") );
147       EnumDesktopWindows ( NULL, MyWindowEnumProc, (LPARAM)&ed );
148       break;
149     case 4:
150       MyTextOut ( hDC, 10, 50, _T("Test #4: EnumThreadWindows") );
151       EnumThreadWindows ( GetCurrentThreadId(), MyWindowEnumProc, (LPARAM)&ed );
152       break;
153     default:
154       MyTextOut ( hDC, 10, 50, _T("Press any of the number keys from 1 to 4 to run a test") );
155       MyTextOut ( hDC, 10, 70, _T("Press the left and right mouse buttons to cycle through the tests") );
156       break;
157     }
158 
159     EndPaint(hWnd, &ps);
160     break;
161 
162   case WM_CHAR:
163     test = (TCHAR)wParam - '1' + 1;
164     RedrawWindow ( hWnd, NULL, NULL, RDW_INVALIDATE );
165     break;
166 
167   case WM_LBUTTONDOWN:
168     if ( ++test > 4 )
169       test = 1;
170     RedrawWindow ( hWnd, NULL, NULL, RDW_INVALIDATE );
171     break;
172 
173   case WM_RBUTTONDOWN:
174     if ( !--test )
175       test = 4;
176     RedrawWindow ( hWnd, NULL, NULL, RDW_INVALIDATE );
177     break;
178 
179   case WM_DESTROY:
180     PostQuitMessage(0);
181     break;
182 
183   default:
184     return DefWindowProc(hWnd, msg, wParam, lParam);
185   }
186   return 0;
187 }
188