ReactOS  0.4.15-dev-448-gd6c4411
MessageStateAnalyzer.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: debugging and analysis of message states
5  * COPYRIGHT: Copyright 2019 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6  */
7 
8 #include "precomp.h"
9 #include "undocuser.h"
10 #include "winxx.h"
11 #include <strsafe.h>
12 
13 static void MsgDumpPrintf(LPCSTR fmt, ...)
14 {
15  static char s_szText[1024];
16  va_list va;
17  va_start(va, fmt);
18  StringCbVPrintfA(s_szText, sizeof(s_szText), fmt, va);
19  trace("%s", s_szText);
20  va_end(va);
21 }
22 #define MSGDUMP_TPRINTF MsgDumpPrintf
23 static char s_prefix[16] = "";
24 #define MSGDUMP_PREFIX s_prefix
25 #include "msgdump.h" /* msgdump.h needs MSGDUMP_TPRINTF and MSGDUMP_PREFIX */
26 
27 typedef enum STAGE_TYPE
28 {
31 } STAGE_TYPE;
32 
33 typedef struct STAGE
34 {
44 } STAGE;
45 
46 /* variables */
47 static INT s_iStage;
48 static INT s_iStep;
49 static INT s_nLevel;
51 static INT s_nCounters[10];
52 static UINT s_msgStack[32];
53 static const STAGE *s_pStages;
54 static INT s_cStages;
55 
56 /* macros */
57 #define TIMEOUT_TIMER 999
58 #define TOTAL_TIMEOUT (5 * 1000)
59 #define WIDTH 300
60 #define HEIGHT 200
61 #define PARENT_MSG s_msgStack[s_nLevel - 1]
62 
63 static void DoInitialize(const STAGE *pStages, INT cStages)
64 {
65  s_iStage = s_iStep = s_nLevel = 0;
69  s_pStages = pStages;
70  s_cStages = cStages;
71 }
72 
73 static void DoFinish(void)
74 {
76  if (s_iStage != s_cStages)
77  {
78  skip("Some stage(s) skipped (Step: %d)\n", s_iStep);
79  }
80 }
81 
82 typedef enum ACTION
83 {
96 } ACTION;
97 
98 static void DoAction(HWND hwnd, INT iAction, WPARAM wParam, LPARAM lParam)
99 {
100  RECT rc;
101  switch (iAction)
102  {
103  case ACTION_ZERO:
104  /* does nothing */
105  break;
106  case ACTION_FIRSTMINMAX:
107  GetWindowRect(hwnd, &rc);
108  ok_long(rc.right - rc.left, 0);
109  ok_long(rc.bottom - rc.top, 0);
111  break;
112  case ACTION_NCCREATE:
113  GetWindowRect(hwnd, &rc);
114  ok_long(rc.right - rc.left, WIDTH);
115  ok_long(rc.bottom - rc.top, HEIGHT);
117  break;
118  case ACTION_SHOW:
120  break;
122  ok(wParam == 1, "Step %d: wParam was %p\n", s_iStep, (void *)wParam);
123  ok(lParam == 0xC000000F, "Step %d: lParam was %p\n", s_iStep, (void *)lParam);
124  break;
126  ok(wParam == 2, "Step %d: wParam was %p\n", s_iStep, (void *)wParam);
127  ok(lParam == 0, "Step %d: lParam was %p\n", s_iStep, (void *)lParam);
128  break;
129  case ACTION_DESTROY:
131  break;
133  ok(wParam == 0, "Step %d: wParam was %p\n", s_iStep, (void *)wParam);
134  ok(lParam == 0xC000000F, "Step %d: lParam was %p\n", s_iStep, (void *)lParam);
135  break;
137  ok(wParam == 1, "Step %d: wParam was %p\n", s_iStep, (void *)wParam);
138  ok(lParam == 0, "Step %d: lParam was %p\n", s_iStep, (void *)lParam);
139  break;
140  case ACTION_HIDE:
142  break;
143  case ACTION_DEACTIVATE:
145  break;
146  case ACTION_ACTIVATE:
148  break;
149  }
150 }
151 
152 static void NextStage(HWND hwnd)
153 {
154  INT i, iAction;
155  const STAGE *pStage = &s_pStages[s_iStage];
156 
157  if (pStage->nType == STAGE_TYPE_COUNTING)
158  {
159  /* check counters */
160  for (i = 0; i < pStage->nCount; ++i)
161  {
162  if (pStage->nCounters[i] > 0)
163  {
164  ok(pStage->nCounters[i] == s_nCounters[i],
165  "Line %d: s_nCounters[%d] expected %d but %d.\n",
166  pStage->nLine, i, pStage->nCounters[i], s_nCounters[i]);
167  }
168  }
169  }
170 
171  /* go to next stage */
172  ++s_iStage;
173  if (s_iStage >= s_cStages)
174  {
176  return;
177  }
178  trace("Stage %d (Line %d)\n", s_iStage, s_pStages[s_iStage].nLine);
179 
180  s_iStep = 0;
182 
183  iAction = s_pStages[s_iStage].iFirstAction;
184  if (iAction)
185  PostMessage(hwnd, WM_COMMAND, iAction, 0);
186 }
187 
189 {
190  INT i, iAction;
191  const STAGE *pStage;
193 
194  if (s_iStage >= s_cStages)
195  return;
196 
197  pStage = &s_pStages[s_iStage];
198  switch (pStage->nType)
199  {
200  case STAGE_TYPE_SEQUENCE:
201  if (pStage->uMessages[s_iStep] == uMsg)
202  {
203  ok_int(1, 1);
204  ok(s_nLevel == pStage->nLevel,
205  "Line %d, Step %d: Level expected %d but %d.\n",
206  pStage->nLine, s_iStep, pStage->nLevel, s_nLevel);
207  ok(PARENT_MSG == pStage->uParentMsg,
208  "Line %d, Step %d: PARENT_MSG expected %u but %u.\n",
209  pStage->nLine, s_iStep, pStage->uParentMsg, PARENT_MSG);
210 
211  iAction = pStage->iActions[s_iStep];
212  if (iAction)
213  DoAction(hwnd, iAction, wParam, lParam);
214 
215  ++s_iStep;
216  if (s_iStep >= pStage->nCount)
217  s_bNextStage = TRUE;
218  }
219  break;
220  case STAGE_TYPE_COUNTING:
221  for (i = 0; i < pStage->nCount; ++i)
222  {
223  if (pStage->uMessages[i] == uMsg)
224  {
225  ok_int(1, 1);
226  ok(s_nLevel == pStage->nLevel,
227  "Line %d: Level expected %d but %d.\n",
228  pStage->nLine, pStage->nLevel, s_nLevel);
229  ok(PARENT_MSG == pStage->uParentMsg,
230  "Line %d: PARENT_MSG expected %u but %u.\n",
231  pStage->nLine, pStage->uParentMsg, PARENT_MSG);
232 
233  iAction = pStage->iActions[i];
234  if (iAction)
235  DoAction(hwnd, iAction, wParam, lParam);
236 
237  ++s_nCounters[i];
238 
239  if (i == pStage->nCount - 1)
240  s_bNextStage = TRUE;
241  break;
242  }
243  }
244  break;
245  }
246 
247  if (s_bNextStage)
248  {
249  NextStage(hwnd);
250  }
251 }
252 
253 static LRESULT CALLBACK
255 {
256  switch (uMsg)
257  {
258  case WM_COMMAND:
259  DoAction(hwnd, LOWORD(wParam), 0, 0);
260  break;
261  case WM_TIMER:
263  if (wParam == TIMEOUT_TIMER)
265  break;
266  case WM_DESTROY:
267  PostQuitMessage(0);
268  break;
269  case WM_NCCREATE:
271  /* FALL THROUGH */
272  default:
273  return DefWindowProc(hwnd, uMsg, wParam, lParam);
274  }
275  return 0;
276 }
277 
278 static void DoBuildPrefix(void)
279 {
281  INT i = 0;
282 
283  if (Flags & ISMEX_CALLBACK)
284  s_prefix[i++] = 'C';
285  if (Flags & ISMEX_NOTIFY)
286  s_prefix[i++] = 'N';
287  if (Flags & ISMEX_REPLIED)
288  s_prefix[i++] = 'R';
289  if (Flags & ISMEX_SEND)
290  s_prefix[i++] = 'S';
291  if (i == 0)
292  s_prefix[i++] = 'P';
293 
294  s_prefix[i++] = ':';
295  s_prefix[i++] = ' ';
296  s_prefix[i] = 0;
297 }
298 
299 static const STAGE s_GeneralStages[] =
300 {
301  /* Stage 0 */
302  {
303  __LINE__, WM_NULL, 1, STAGE_TYPE_SEQUENCE, 0,
304  4,
307  },
308  /* Stage 1 */
309  {
311  6,
314  },
315  {
317  6,
320  },
321  {
322  __LINE__, WM_COMMAND, 2, STAGE_TYPE_SEQUENCE, 0,
323  2,
325  },
326 };
327 
328 static LRESULT CALLBACK
330 {
331  LRESULT lResult;
332 
333  /* Skip asynchronous WM_TIMER messages */
334  if (uMsg == WM_TIMER) return InnerWindowProc(hwnd, uMsg, wParam, lParam);
335 
336  /* build s_prefix */
337  DoBuildPrefix();
338 
339  /* message dump */
340  MD_msgdump(hwnd, uMsg, wParam, lParam);
341 
342  ++s_nLevel;
343  s_msgStack[s_nLevel] = uMsg;
344  {
345  /* do inner task */
346  DoStage(hwnd, uMsg, wParam, lParam);
347  lResult = InnerWindowProc(hwnd, uMsg, wParam, lParam);
348  }
349  --s_nLevel;
350 
351  /* message return */
352  StringCbCopyA(s_prefix, sizeof(s_prefix), "R: ");
353  MD_msgresult(hwnd, uMsg, wParam, lParam, lResult);
354  return lResult;
355 }
356 
357 static void General_DoTest(void)
358 {
359  WNDCLASSA wc;
360  HWND hwnd;
361  MSG msg;
362  static const char s_szName[] = "MessageStateAnalyzerGeneral";
363 
364  trace("General_DoTest\n");
366 
367  /* register window class */
368  ZeroMemory(&wc, sizeof(wc));
370  wc.lpfnWndProc = WindowProc;
374  wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
375  wc.lpszClassName = s_szName;
376  if (!RegisterClassA(&wc))
377  {
378  skip("RegisterClassW failed.\n");
379  return;
380  }
381 
382  /* create a window */
384  0, 0, WIDTH, HEIGHT, NULL, NULL,
386  if (!hwnd)
387  {
388  skip("CreateWindowW failed.\n");
389  return;
390  }
391 
392  /* message loop */
393  while (GetMessageA(&msg, NULL, 0, 0))
394  {
397  }
398 
400 
401  DoFinish();
402 }
403 
404 static const STAGE s_IMEStages[] =
405 {
406  /* Stage 0 */
407  {
408  __LINE__, WM_NULL, 1, STAGE_TYPE_SEQUENCE, 0,
409  4,
412  },
413  /* Stage 1 */
414  // show
415  {
417  6,
420  },
421  {
422  __LINE__, WM_ACTIVATE, 3, STAGE_TYPE_SEQUENCE, 0,
423  1,
424  { WM_IME_SETCONTEXT },
426  },
427  {
428  __LINE__, WM_IME_SETCONTEXT, 4, STAGE_TYPE_SEQUENCE, 0,
429  1,
430  { WM_IME_NOTIFY },
432  },
433  // hide
434  {
436  8,
440  { 0, 0, 0, 0, 0, 0, 0, ACTION_IME_SETCONTEXT_CLOSE }
441  },
442  {
443  __LINE__, WM_IME_SETCONTEXT, 3, STAGE_TYPE_SEQUENCE, 0,
444  1,
445  { WM_IME_NOTIFY },
447  },
448  // show again
449  {
450  __LINE__, WM_COMMAND, 2, STAGE_TYPE_SEQUENCE, 3,
451  6,
454  },
455  {
456  __LINE__, WM_ACTIVATE, 3, STAGE_TYPE_SEQUENCE, 0,
457  1,
458  { WM_IME_SETCONTEXT },
460  },
461  {
462  __LINE__, WM_IME_SETCONTEXT, 4, STAGE_TYPE_SEQUENCE, 0,
463  1,
464  { WM_IME_NOTIFY },
466  },
467  // deactivate
468  {
470  4,
472  },
473  {
474  __LINE__, WM_COMMAND, 2, STAGE_TYPE_SEQUENCE, 0,
475  1,
476  { WM_IME_SETCONTEXT },
478  },
479  {
480  __LINE__, WM_IME_SETCONTEXT, 3, STAGE_TYPE_SEQUENCE, 0,
481  1,
482  { WM_IME_NOTIFY },
484  },
485  // activate
486  {
488  1,
489  { WM_IME_SETCONTEXT },
491  },
492  {
493  __LINE__, WM_IME_SETCONTEXT, 4, STAGE_TYPE_SEQUENCE, 0,
494  1,
495  { WM_IME_NOTIFY },
497  },
498  // destroy
499  {
501  2,
503  },
504  {
505  __LINE__, WM_COMMAND, 2, STAGE_TYPE_SEQUENCE, 0,
506  1,
507  { WM_IME_SETCONTEXT },
509  },
510  {
511  __LINE__, WM_IME_SETCONTEXT, 3, STAGE_TYPE_SEQUENCE, 0,
512  1,
513  { WM_IME_NOTIFY },
515  },
516  {
517  __LINE__, WM_COMMAND, 2, STAGE_TYPE_SEQUENCE, 0,
518  2,
520  },
521 };
522 
523 static void IME_DoTest(void)
524 {
525  WNDCLASSA wc;
526  HWND hwnd;
527  MSG msg;
528  static const char s_szName[] = "MessageStateAnalyzerIME";
529 
530  trace("IME_DoTest\n");
532 
533  /* register window class */
534  ZeroMemory(&wc, sizeof(wc));
536  wc.lpfnWndProc = WindowProc;
540  wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
541  wc.lpszClassName = s_szName;
542  if (!RegisterClassA(&wc))
543  {
544  skip("RegisterClassW failed.\n");
545  return;
546  }
547 
548  /* create a window */
550  0, 0, WIDTH, HEIGHT, NULL, NULL,
552  if (!hwnd)
553  {
554  skip("CreateWindowW failed.\n");
555  return;
556  }
557 
558  /* message loop */
559  while (GetMessageA(&msg, NULL, 0, 0))
560  {
563  }
564 
566 
567  DoFinish();
568 }
569 
570 START_TEST(MessageStateAnalyzer)
571 {
572  General_DoTest();
573  IME_DoTest();
574 }
#define WIDTH
#define WM_NULL
Definition: winuser.h:1589
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
INT iActions[10]
#define WM_IME_NOTIFY
Definition: winuser.h:1812
BOOL WINAPI TranslateMessage(_In_ const MSG *)
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define TRUE
Definition: types.h:120
static const STAGE * s_pStages
#define SW_HIDE
Definition: winuser.h:762
#define WM_NCCALCSIZE
Definition: winuser.h:1667
static void DoBuildPrefix(void)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
static INT s_nLevel
static void NextStage(HWND hwnd)
#define CALLBACK
Definition: compat.h:27
static void General_DoTest(void)
LONG top
Definition: windef.h:307
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define WM_SHOWWINDOW
Definition: winuser.h:1610
#define ZeroMemory
Definition: winbase.h:1648
#define CS_HREDRAW
Definition: winuser.h:648
static void DoStage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
#define IDI_APPLICATION
Definition: winuser.h:699
UINT_PTR WPARAM
Definition: windef.h:207
HBRUSH hbrBackground
Definition: winuser.h:3145
LONG left
Definition: windef.h:306
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
static void MsgDumpPrintf(LPCSTR fmt,...)
#define ok_long(expression, result)
Definition: atltest.h:133
LONG right
Definition: windef.h:308
#define WM_NCCREATE
Definition: winuser.h:1665
BOOL WINAPI DestroyWindow(_In_ HWND)
int32_t INT
Definition: typedefs.h:57
START_TEST(MessageStateAnalyzer)
static BOOL s_bNextStage
WPARAM wParam
Definition: combotst.c:138
static void DoFinish(void)
struct STAGE STAGE
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define COLOR_3DFACE
Definition: winuser.h:919
static INT s_nCounters[10]
#define va_end(ap)
Definition: acmsvcex.h:90
#define WM_NCACTIVATE
Definition: winuser.h:1670
static const STAGE s_GeneralStages[]
unsigned int BOOL
Definition: ntddk_ex.h:94
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4290
HCURSOR hCursor
Definition: winuser.h:3144
static void IME_DoTest(void)
smooth NULL
Definition: ftsmooth.c:416
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:656
#define ok_int(expression, result)
Definition: atltest.h:134
STRSAFEAPI StringCbCopyA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:161
LONG_PTR LPARAM
Definition: windef.h:208
char * va_list
Definition: acmsvcex.h:78
static LRESULT CALLBACK InnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
const char * LPCSTR
Definition: xmlstorage.h:183
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define DefWindowProc
Definition: ros2win.h:31
#define WM_DESTROY
Definition: winuser.h:1591
#define PostMessage
Definition: winuser.h:5807
#define CS_VREDRAW
Definition: winuser.h:653
#define WM_KILLFOCUS
Definition: winuser.h:1596
#define trace
Definition: atltest.h:70
static INT s_iStage
static UINT s_msgStack[32]
#define WM_IME_SETCONTEXT
Definition: winuser.h:1811
#define WM_TIMER
Definition: winuser.h:1724
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1643
#define WM_NCDESTROY
Definition: winuser.h:1666
DWORD WINAPI InSendMessageEx(LPVOID lpReserved)
Definition: message.c:1391
unsigned long DWORD
Definition: ntddk_ex.h:95
#define HEIGHT
STRSAFEAPI StringCbVPrintfA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszFormat, va_list argList)
Definition: strsafe.h:502
#define TIMEOUT_TIMER
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define CS_DBLCLKS
Definition: winuser.h:646
#define WM_COMMAND
Definition: winuser.h:1722
static INT s_cStages
LPCSTR lpszClassName
Definition: winuser.h:3147
STAGE_TYPE nType
#define LoadCursor
Definition: winuser.h:5787
UINT style
Definition: winuser.h:3138
static char s_prefix[16]
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WM_ACTIVATEAPP
Definition: winuser.h:1614
#define WM_ACTIVATE
Definition: winuser.h:1594
INT nCounters[10]
HINSTANCE hInstance
Definition: winuser.h:3142
#define ok(value,...)
Definition: atltest.h:57
static WCHAR s_szName[MAX_PATH]
Definition: find.c:34
UINT uMessages[10]
#define va_start(ap, A)
Definition: acmsvcex.h:91
unsigned int UINT
Definition: ndis.h:50
static void DoInitialize(const STAGE *pStages, INT cStages)
WNDPROC lpfnWndProc
Definition: winuser.h:3139
#define skip(...)
Definition: atltest.h:64
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1644
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
#define WM_CREATE
Definition: winuser.h:1590
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
static __inline LRESULT MSGDUMP_API MD_msgresult(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT lResult)
Definition: msgdump.h:5359
BOOL WINAPI IsWindowVisible(_In_ HWND)
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
BOOL WINAPI SetForegroundWindow(_In_ HWND)
LONG bottom
Definition: windef.h:309
static void DoAction(HWND hwnd, INT iAction, WPARAM wParam, LPARAM lParam)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI UnregisterClassA(_In_ LPCSTR, HINSTANCE)
static INT s_iStep
#define LoadIcon
Definition: winuser.h:5788
LONG_PTR LRESULT
Definition: windef.h:209
LPARAM lParam
Definition: combotst.c:139
#define WM_GETMINMAXINFO
Definition: winuser.h:1622
#define LOWORD(l)
Definition: pedump.c:82
static __inline LRESULT MSGDUMP_API MD_msgdump(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: msgdump.h:4655
Definition: dsound.c:943
static const STAGE s_IMEStages[]
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define TOTAL_TIMEOUT
#define PARENT_MSG
HICON hIcon
Definition: winuser.h:3143