Vanara/PInvoke/User32/User32_WindowMessage.cs

10747 lines
501 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
namespace Vanara.PInvoke
{
public static partial class User32
{
/// <summary>Windows Messages</summary>
public enum WindowMessage
{
/// <summary>
/// <para>
/// Performs no operation. An application sends the <c>WM_NULL</c> message if it wants to post a message that the recipient
/// window will ignore.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NULL 0x0000</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application returns zero if it processes this message.</para>
/// <remarks>
/// <para>
/// For example, if an application has installed a <c>WH_GETMESSAGE</c> hook and wants to prevent a message from being processed,
/// the <c>GetMsgProc</c> callback function can change the message number to <c>WM_NULL</c> so the recipient will ignore it.
/// </para>
/// <para>
/// As another example, an application can check if a window is responding to messages by sending the <c>WM_NULL</c> message with
/// the <c>SendMessageTimeout</c> function.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-null
WM_NULL = 0x0000,
/// <summary>
/// <para>
/// Sent when an application requests that a window be created by calling the <c>CreateWindowEx</c> or <c>CreateWindow</c>
/// function. (The message is sent before the function returns.) The window procedure of the new window receives this message
/// after the window is created, but before the window becomes visible.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_CREATE 0x0001</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a <c>CREATESTRUCT</c> structure that contains information about the window being created.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// If an application processes this message, it should return zero to continue creation of the window. If the application
/// returns 1, the window is destroyed and the <c>CreateWindowEx</c> or <c>CreateWindow</c> function returns a <c>NULL</c> handle.
/// </para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-create
WM_CREATE = 0x0001,
/// <summary>
/// <para>
/// Sent when a window is being destroyed. It is sent to the window procedure of the window being destroyed after the window is
/// removed from the screen.
/// </para>
/// <para>
/// This message is sent first to the window being destroyed and then to the child windows (if any) as they are destroyed. During
/// the processing of the message, it can be assumed that all child windows still exist.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_DESTROY 0x0002</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// If the window being destroyed is part of the clipboard viewer chain (set by calling the <c>SetClipboardViewer</c> function),
/// the window must remove itself from the chain by processing the <c>ChangeClipboardChain</c> function before returning from the
/// <c>WM_DESTROY</c> message.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-destroy
WM_DESTROY = 0x0002,
/// <summary>
/// <para>Sent after a window has been moved.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOVE 0x0003</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The x and y coordinates of the upper-left corner of the client area of the window. The low-order word contains the
/// x-coordinate while the high-order word contains the y coordinate.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The parameters are given in screen coordinates for overlapped and pop-up windows and in parent-client coordinates for child windows.
/// </para>
/// <para>The following example demonstrates how to obtain the position from the lParam parameter.</para>
/// <para>
/// <code>xPos = (int)(short) LOWORD(lParam); // horizontal position yPos = (int)(short) HIWORD(lParam); // vertical position</code>
/// </para>
/// <para>You can also use the <c>MAKEPOINTS</c> macro to convert the lParam parameter to a <c>POINTS</c> structure.</para>
/// <para>
/// The <c>DefWindowProc</c> function sends the <c>WM_SIZE</c> and <c>WM_MOVE</c> messages when it processes the
/// <c>WM_WINDOWPOSCHANGED</c> message. The <c>WM_SIZE</c> and <c>WM_MOVE</c> messages are not sent if an application handles the
/// <c>WM_WINDOWPOSCHANGED</c> message without calling <c>DefWindowProc</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-move
WM_MOVE = 0x0003,
/// <summary>
/// <para>Sent to a window after its size has changed.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_SIZE 0x0005</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The type of resizing requested. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SIZE_MAXHIDE</c> 4</term>
/// <term>Message is sent to all pop-up windows when some other window is maximized.</term>
/// </item>
/// <item>
/// <term><c>SIZE_MAXIMIZED</c> 2</term>
/// <term>The window has been maximized.</term>
/// </item>
/// <item>
/// <term><c>SIZE_MAXSHOW</c> 3</term>
/// <term>Message is sent to all pop-up windows when some other window has been restored to its former size.</term>
/// </item>
/// <item>
/// <term><c>SIZE_MINIMIZED</c> 1</term>
/// <term>The window has been minimized.</term>
/// </item>
/// <item>
/// <term><c>SIZE_RESTORED</c> 0</term>
/// <term>The window has been resized, but neither the <c>SIZE_MINIMIZED</c> nor <c>SIZE_MAXIMIZED</c> value applies.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>The low-order word of lParam specifies the new width of the client area.</para>
/// <para>The high-order word of lParam specifies the new height of the client area.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// If the <c>SetScrollPos</c> or <c>MoveWindow</c> function is called for a child window as a result of the <c>WM_SIZE</c>
/// message, the bRedraw or bRepaint parameter should be nonzero to cause the window to be repainted.
/// </para>
/// <para>
/// Although the width and height of a window are 32-bit values, the lParam parameter contains only the low-order 16 bits of each.
/// </para>
/// <para>
/// The <c>DefWindowProc</c> function sends the <c>WM_SIZE</c> and <c>WM_MOVE</c> messages when it processes the
/// <c>WM_WINDOWPOSCHANGED</c> message. The <c>WM_SIZE</c> and <c>WM_MOVE</c> messages are not sent if an application handles the
/// <c>WM_WINDOWPOSCHANGED</c> message without calling <c>DefWindowProc</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-size
WM_SIZE = 0x0005,
/// <summary>
/// <para>
/// Sent to both the window being activated and the window being deactivated. If the windows use the same input queue, the
/// message is sent synchronously, first to the window procedure of the top-level window being deactivated, then to the window
/// procedure of the top-level window being activated. If the windows use different input queues, the message is sent
/// asynchronously, so the window is activated immediately.
/// </para>
/// <para>
/// <code>#define WM_ACTIVATE 0x0006</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The low-order word specifies whether the window is being activated or deactivated. This parameter can be one of the following
/// values. The high-order word specifies the minimized state of the window being activated or deactivated. A nonzero value
/// indicates the window is minimized.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>WA_ACTIVE</c> 1</term>
/// <term>
/// Activated by some method other than a mouse click (for example, by a call to the <c>SetActiveWindow</c> function or by use of
/// the keyboard interface to select the window).
/// </term>
/// </item>
/// <item>
/// <term><c>WA_CLICKACTIVE</c> 2</term>
/// <term>Activated by a mouse click.</term>
/// </item>
/// <item>
/// <term><c>WA_INACTIVE</c> 0</term>
/// <term>Deactivated.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A handle to the window being activated or deactivated, depending on the value of the wParam parameter. If the low-order word
/// of wParam is <c>WA_INACTIVE</c>, lParam is the handle to the window being activated. If the low-order word of wParam is
/// <c>WA_ACTIVE</c> or <c>WA_CLICKACTIVE</c>, lParam is the handle to the window being deactivated. This handle can be <c>NULL</c>.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// If the window is being activated and is not minimized, the <c>DefWindowProc</c> function sets the keyboard focus to the
/// window. If the window is activated by a mouse click, it also receives a <c>WM_MOUSEACTIVATE</c> message.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-activate
WM_ACTIVATE = 0x0006,
/// <summary>
/// <para>Sent to a window after it has gained the keyboard focus.</para>
/// <para>
/// <code>#define WM_SETFOCUS 0x0007</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window that has lost the keyboard focus. This parameter can be <c>NULL</c>.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// To display a caret, an application should call the appropriate caret functions when it receives the <c>WM_SETFOCUS</c> message.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-setfocus
WM_SETFOCUS = 0x0007,
/// <summary>
/// <para>Sent to a window immediately before it loses the keyboard focus.</para>
/// <para>
/// <code>#define WM_KILLFOCUS 0x0008</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window that receives the keyboard focus. This parameter can be <c>NULL</c>.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>If an application is displaying a caret, the caret should be destroyed at this point.</para>
/// <para>
/// While processing this message, do not make any function calls that display or activate a window. This causes the thread to
/// yield control and can cause the application to stop responding to messages. For more information, see Message Deadlocks.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-killfocus
WM_KILLFOCUS = 0x0008,
/// <summary>
/// <para>
/// Sent when an application changes the enabled state of a window. It is sent to the window whose enabled state is changing.
/// This message is sent before the <c>EnableWindow</c> function returns, but after the enabled state ( <c>WS_DISABLED</c> style
/// bit) of the window has changed.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_ENABLE 0x000A</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Indicates whether the window has been enabled or disabled. This parameter is <c>TRUE</c> if the window has been enabled or
/// <c>FALSE</c> if the window has been disabled.
/// </para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-enable
WM_ENABLE = 0x000A,
/// <summary>
/// <para>
/// You send the <c>WM_SETREDRAW</c> message to a window to allow changes in that window to be redrawn, or to prevent changes in
/// that window from being redrawn.
/// </para>
/// <para>To send this message, call the <c>SendMessage</c> function with the following parameters.</para>
/// <para>
/// <code>SendMessage( (HWND) hWnd, WM_SETREDRAW, (WPARAM) wParam, (LPARAM) lParam );</code>
/// </para>
/// <para><em>wParam</em></para>
/// <para>
/// The redraw state. If this parameter is <c>TRUE</c>, then the content can be redrawn after a change. If this parameter is
/// <c>FALSE</c>, then the content can't be redrawn after a change.
/// </para>
/// <para><em>lParam</em></para>
/// <para>This parameter isn't used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Your application should return 0 if it processes this message.</para>
/// </summary>
/// <remarks>
/// <para>
/// This message can be useful if your application must add several items to a list box. Your application can call this message
/// with wParam set to <c>FALSE</c>, add the items, and then call the message again with wParam set to <c>TRUE</c>. Finally, your
/// application can call <c>RedrawWindow</c>(hWnd, <c>NULL</c>, <c>NULL</c>, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE |
/// RDW_ALLCHILDREN) to cause the list box to be repainted.
/// </para>
/// <para>
/// <para>Note</para>
/// <para>
/// You should use <c>RedrawWindow</c> with the specified flags, instead of <c>InvalidateRect</c>, because the former is
/// necessary for some controls that have nonclient area of their own, or have window styles that cause them to be given a
/// nonclient area (such as <c>WS_THICKFRAME</c>, <c>WS_BORDER</c>, or <c>WS_EX_CLIENTEDGE</c>). If the control does not have a
/// nonclient area, then <c>RedrawWindow</c> with these flags will do only as much invalidation as <c>InvalidateRect</c> would.
/// </para>
/// </para>
/// <para>
/// Passing a <c>WM_SETREDRAW</c> message to the <c>DefWindowProc</c> function removes the <c>WS_VISIBLE</c> style from the
/// window when wParam is set to <c>FALSE</c>. Although the window content remains visible on screen, the <c>IsWindowVisible</c>
/// function returns <c>FALSE</c> when called on a window in this state.
/// </para>
/// <para>
/// Passing a <c>WM_SETREDRAW</c> message to the <c>DefWindowProc</c> function adds the <c>WS_VISIBLE</c> style to the window, if
/// not set, when wParam is set to <c>TRUE</c>. If your application sends the <c>WM_SETREDRAW</c> message with wParam set to
/// <c>TRUE</c> to a hidden window, then the window becomes visible.
/// </para>
/// <para>
/// <c>Windows 10 and later; Windows Server 2016 and later</c>. The system sets a property named SysSetRedraw on a window whose
/// window procedure passes <c>WM_SETREDRAW</c> messages to <c>DefWindowProc</c>. You can use the <c>GetProp</c> function to get
/// the property value when it's available. <c>GetProp</c> returns a non-zero value when redraw is disabled. <c>GetProp</c> will
/// return zero when redraw is enabled, or when the window property doesn't exist.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-setredraw
WM_SETREDRAW = 0x000B,
/// <summary>
/// <para>Sets the text of a window.</para>
/// <para>
/// <code>#define WM_SETTEXT 0x000C</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a null-terminated string that is the window text.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// The return value is <c>TRUE</c> if the text is set. It is <c>FALSE</c> (for an edit control), <c>LB_ERRSPACE</c> (for a list
/// box), or <c>CB_ERRSPACE</c> (for a combo box) if insufficient space is available to set the text in the edit control. It is
/// <c>CB_ERR</c> if this message is sent to a combo box without an edit control.
/// </para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function sets and displays the window text. For an edit control, the text is the contents of the
/// edit control. For a combo box, the text is the contents of the edit-control portion of the combo box. For a button, the text
/// is the button name. For other windows, the text is the window title.
/// </para>
/// <para>
/// This message does not change the current selection in the list box of a combo box. An application should use the
/// <c>CB_SELECTSTRING</c> message to select the item in a list box that matches the text in the edit control.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settext
WM_SETTEXT = 0x000C,
/// <summary>
/// <para>Copies the text that corresponds to a window into a buffer provided by the caller.</para>
/// <para>
/// <code>#define WM_GETTEXT 0x000D</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The maximum number of characters to be copied, including the terminating null character.</para>
/// <para>
/// ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to
/// conversion from ANSI to Unicode.
/// </para>
/// <para><em>lParam</em></para>
/// <para>A pointer to the buffer that is to receive the text.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>The return value is the number of characters copied, not including the terminating null character.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function copies the text associated with the window into the specified buffer and returns the number
/// of characters copied. Note, for non-text static controls this gives you the text with which the control was originally
/// created, that is, the ID number. However, it gives you the ID of the non-text static control as originally created. That is,
/// if you subsequently used a <c>STM_SETIMAGE</c> to change it the original ID would still be returned.
/// </para>
/// <para>
/// For an edit control, the text to be copied is the content of the edit control. For a combo box, the text is the content of
/// the edit control (or static-text) portion of the combo box. For a button, the text is the button name. For other windows, the
/// text is the window title. To copy the text of an item in a list box, an application can use the <c>LB_GETTEXT</c> message.
/// </para>
/// <para>
/// When the <c>WM_GETTEXT</c> message is sent to a static control with the <c>SS_ICON</c> style, a handle to the icon will be
/// returned in the first four bytes of the buffer pointed to by lParam. This is true only if the <c>WM_SETTEXT</c> message has
/// been used to set the icon.
/// </para>
/// <para>
/// <c>Rich Edit:</c> If the text to be copied exceeds 64K, use either the <c>EM_STREAMOUT</c> or <c>EM_GETSELTEXT</c> message.
/// </para>
/// <para>
/// Sending a <c>WM_GETTEXT</c> message to a non-text static control, such as a static bitmap or static icon control, does not
/// return a string value. Instead, it returns zero. In addition, in early versions of Windows, applications could send a
/// <c>WM_GETTEXT</c> message to a non-text static control to retrieve the control's ID. To retrieve a control's ID, applications
/// can use <c>GetWindowLong</c> passing <c>GWL_ID</c> as the index value or <c>GetWindowLongPtr</c> using <c>GWLP_ID</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-gettext
WM_GETTEXT = 0x000D,
/// <summary>
/// <para>Determines the length, in characters, of the text associated with a window.</para>
/// <para>
/// <code>#define WM_GETTEXTLENGTH 0x000E</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>The return value is the length of the text in characters, not including the terminating null character.</para>
/// <remarks>
/// <para>
/// For an edit control, the text to be copied is the content of the edit control. For a combo box, the text is the content of
/// the edit control (or static-text) portion of the combo box. For a button, the text is the button name. For other windows, the
/// text is the window title. To determine the length of an item in a list box, an application can use the <c>LB_GETTEXTLEN</c> message.
/// </para>
/// <para>
/// When the <c>WM_GETTEXTLENGTH</c> message is sent, the <c>DefWindowProc</c> function returns the length, in characters, of the
/// text. Under certain conditions, the <c>DefWindowProc</c> function returns a value that is larger than the actual length of
/// the text. This occurs with certain mixtures of ANSI and Unicode, and is due to the system allowing for the possible existence
/// of double-byte character set (DBCS) characters within the text. The return value, however, will always be at least as large
/// as the actual length of the text; you can thus always use it to guide buffer allocation. This behavior can occur when an
/// application uses both ANSI functions and common dialogs, which use Unicode.
/// </para>
/// <para>
/// To obtain the exact length of the text, use the <c>WM_GETTEXT</c>, <c>LB_GETTEXT</c>, or <c>CB_GETLBTEXT</c> messages, or the
/// <c>GetWindowText</c> function.
/// </para>
/// <para>
/// Sending a <c>WM_GETTEXTLENGTH</c> message to a non-text static control, such as a static bitmap or static icon controlc, does
/// not return a string value. Instead, it returns zero.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-gettextlength
WM_GETTEXTLENGTH = 0x000E,
/// <summary>
/// <para>
/// The <c>WM_PAINT</c> message is sent when the system or another application makes a request to paint a portion of an
/// application's window. The message is sent when the <c>UpdateWindow</c> or <c>RedrawWindow</c> function is called, or by the
/// <c>DispatchMessage</c> function when the application obtains a <c>WM_PAINT</c> message by using the <c>GetMessage</c> or
/// <c>PeekMessage</c> function.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application returns zero if it processes this message.</para>
/// <remarks>
/// <para>
/// The <c>WM_PAINT</c> message is generated by the system and should not be sent by an application. To force a window to draw
/// into a specific device context, use the <c>WM_PRINT</c> or <c>WM_PRINTCLIENT</c> message. Note that this requires the target
/// window to support the <c>WM_PRINTCLIENT</c> message. Most common controls support the <c>WM_PRINTCLIENT</c> message.
/// </para>
/// <para>
/// The <c>DefWindowProc</c> function validates the update region. The function may also send the <c>WM_NCPAINT</c> message to
/// the window procedure if the window frame must be painted and send the <c>WM_ERASEBKGND</c> message if the window background
/// must be erased.
/// </para>
/// <para>
/// The system sends this message when there are no other messages in the application's message queue. <c>DispatchMessage</c>
/// determines where to send the message; <c>GetMessage</c> determines which message to dispatch. <c>GetMessage</c> returns the
/// <c>WM_PAINT</c> message when there are no other messages in the application's message queue, and <c>DispatchMessage</c> sends
/// the message to the appropriate window procedure.
/// </para>
/// <para>
/// A window may receive internal paint messages as a result of calling <c>RedrawWindow</c> with the RDW_INTERNALPAINT flag set.
/// In this case, the window may not have an update region. An application may call the <c>GetUpdateRect</c> function to
/// determine whether the window has an update region. If <c>GetUpdateRect</c> returns zero, the application need not call the
/// <c>BeginPaint</c> and <c>EndPaint</c> functions.
/// </para>
/// <para>
/// An application must check for any necessary internal painting by looking at its internal data structures for each
/// <c>WM_PAINT</c> message, because a <c>WM_PAINT</c> message may have been caused by both a non-NULL update region and a call
/// to <c>RedrawWindow</c> with the RDW_INTERNALPAINT flag set.
/// </para>
/// <para>
/// The system sends an internal <c>WM_PAINT</c> message only once. After an internal <c>WM_PAINT</c> message is returned from
/// <c>GetMessage</c> or <c>PeekMessage</c> or is sent to a window by <c>UpdateWindow</c>, the system does not post or send
/// further <c>WM_PAINT</c> messages until the window is invalidated or until <c>RedrawWindow</c> is called again with the
/// RDW_INTERNALPAINT flag set.
/// </para>
/// <para>
/// For some common controls, the default <c>WM_PAINT</c> message processing checks the wParam parameter. If wParam is non-NULL,
/// the control assumes that the value is an HDC and paints using that device context.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-paint
WM_PAINT = 0x000F,
/// <summary>
/// <para>Sent as a signal that a window or an application should terminate.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_CLOSE 0x0010</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// An application can prompt the user for confirmation, prior to destroying a window, by processing the <c>WM_CLOSE</c> message
/// and calling the <c>DestroyWindow</c> function only if the user confirms the choice.
/// </para>
/// <para>By default, the <c>DefWindowProc</c> function calls the <c>DestroyWindow</c> function to destroy the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-close
WM_CLOSE = 0x0010,
/// <summary>
/// <para>
/// The <c>WM_QUERYENDSESSION</c> message is sent when the user chooses to end the session or when an application calls one of
/// the system shutdown functions. If any application returns zero, the session is not ended. The system stops sending
/// <c>WM_QUERYENDSESSION</c> messages as soon as one application returns zero.
/// </para>
/// <para>
/// After processing this message, the system sends the <c>WM_ENDSESSION</c> message with the wParam parameter set to the results
/// of the <c>WM_QUERYENDSESSION</c> message.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // not used LPARAM lParam // logoff option );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to the window.</para>
/// <para><em>uMsg</em></para>
/// <para>The <c>WM_QUERYENDSESSION</c> identifier.</para>
/// <para><em>wParam</em></para>
/// <para>This parameter is reserved for future use.</para>
/// <para><em>lParam</em></para>
/// <para>
/// This parameter can be one or more of the following values. If this parameter is 0, the system is shutting down or restarting
/// (it is not possible to determine which event is occurring).
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>ENDSESSION_CLOSEAPP</c> 0x00000001</term>
/// <term>
/// The application is using a file that must be replaced, the system is being serviced, or system resources are exhausted. For
/// more information, see Guidelines for Applications.
/// </term>
/// </item>
/// <item>
/// <term><c>ENDSESSION_CRITICAL</c> 0x40000000</term>
/// <term>The application is forced to shut down.</term>
/// </item>
/// <item>
/// <term><c>ENDSESSION_LOGOFF</c> 0x80000000</term>
/// <term>The user is logging off. For more information, see Logging Off.</term>
/// </item>
/// </list>
/// <para>Note that this parameter is a bit mask. To test for this value, use a bit-wise operation; do not test for equality.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// Applications should respect the user's intentions and return <c>TRUE</c>. By default, the <c>DefWindowProc</c> function
/// returns <c>TRUE</c> for this message.
/// </para>
/// <para>
/// If shutting down would corrupt the system or media that is being burned, the application can return <c>FALSE</c>. However, it
/// is good practice to respect the user's actions.
/// </para>
/// <remarks>
/// <para>
/// When an application returns <c>TRUE</c> for this message, it receives the <c>WM_ENDSESSION</c> message, regardless of how the
/// other applications respond to the <c>WM_QUERYENDSESSION</c> message. Each application should return <c>TRUE</c> or
/// <c>FALSE</c> immediately upon receiving this message, and defer any cleanup operations until it receives the
/// <c>WM_ENDSESSION</c> message.
/// </para>
/// <para>
/// Applications can display a user interface prompting the user for information at shutdown, however it is not recommended.
/// After five seconds, the system displays information about the applications that are preventing shutdown and allows the user
/// to terminate them. For example, Windows XP displays a dialog box, while Windows Vista displays a full screen with additional
/// information about the applications blocking shutdown. If your application must block or postpone system shutdown, use the
/// <c>ShutdownBlockReasonCreate</c> function. For more information, see Shutdown Changes for Windows Vista.
/// </para>
/// <para>Console applications can use the <c>SetConsoleCtrlHandler</c> function to receive shutdown notification.</para>
/// <para>
/// Service applications can use the <c>RegisterServiceCtrlHandlerEx</c> function to receive shutdown notifications in a handler routine.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/shutdown/wm-queryendsession
WM_QUERYENDSESSION = 0x0011,
/// <summary>
/// <para>Sent to an icon when the user requests that the window be restored to its previous size and position.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_QUERYOPEN 0x0013</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// If the icon can be opened, an application that processes this message should return <c>TRUE</c>; otherwise, it should return
/// <c>FALSE</c> to prevent the icon from being opened.
/// </para>
/// <remarks>
/// <para>By default, the <c>DefWindowProc</c> function returns <c>TRUE</c>.</para>
/// <para>
/// While processing this message, the application should not perform any action that would cause an activation or focus change
/// (for example, creating a dialog box).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-queryopen
WM_QUERYOPEN = 0x0013,
/// <summary>
/// <para>
/// The <c>WM_ENDSESSION</c> message is sent to an application after the system processes the results of the
/// <c>WM_QUERYENDSESSION</c> message. The <c>WM_ENDSESSION</c> message informs the application whether the session is ending.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // end-session option LPARAM lParam // logoff option );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to the window.</para>
/// <para><em>uMsg</em></para>
/// <para>The <c>WM_ENDSESSION</c> identifier.</para>
/// <para><em>wParam</em></para>
/// <para>
/// If the session is being ended, this parameter is <c>TRUE</c>; the session can end any time after all applications have
/// returned from processing this message. Otherwise, it is <c>FALSE</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// This parameter can be one or more of the following values. If this parameter is 0, the system is shutting down or restarting
/// (it is not possible to determine which event is occurring).
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>ENDSESSION_CLOSEAPP</c> 0x1</term>
/// <term>
/// If <c>wParam</c> is <c>TRUE</c>, the application must shut down. Any data should be saved automatically without prompting the
/// user (for more information, see Remarks). The Restart Manager sends this message when the application is using a file that
/// needs to be replaced, when it must service the system, or when system resources are exhausted. The application will be
/// restarted if it has registered for restart using the <c>RegisterApplicationRestart</c> function. For more information, see
/// Guidelines for Applications. If <c>wParam</c> is <c>FALSE</c>, the application should not shut down.
/// </term>
/// </item>
/// <item>
/// <term><c>ENDSESSION_CRITICAL</c> 0x40000000</term>
/// <term>The application is forced to shut down.</term>
/// </item>
/// <item>
/// <term><c>ENDSESSION_LOGOFF</c> 0x80000000</term>
/// <term>The user is logging off. For more information, see Logging Off.</term>
/// </item>
/// </list>
/// <para>Note that this parameter is a bit mask. To test for this value, use a bit-wise operation; do not test for equality.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// Applications that have unsaved data could save the data to a temporary location and restore it the next time the application
/// starts. It is recommended that applications save their data and state frequently; for example, automatically save data
/// between save operations initiated by the user to reduce the amount of data to be saved at shutdown.
/// </para>
/// <para>The application need not call the <c>DestroyWindow</c> or <c>PostQuitMessage</c> function when the session is ending.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/shutdown/wm-endsession
WM_ENDSESSION = 0x0016,
/// <summary>
/// <para>
/// Indicates a request to terminate an application, and is generated when the application calls the <c>PostQuitMessage</c>
/// function. This message causes the <c>GetMessage</c> function to return zero.
/// </para>
/// <para>
/// <code>#define WM_QUIT 0x0012</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The exit code given in the <c>PostQuitMessage</c> function.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// This message does not have a return value because it causes the message loop to terminate before the message is sent to the
/// application's window procedure.
/// </para>
/// <remarks>
/// <para>
/// The <c>WM_QUIT</c> message is not associated with a window and therefore will never be received through a window's window
/// procedure. It is retrieved only by the <c>GetMessage</c> or <c>PeekMessage</c> functions.
/// </para>
/// <para>Do not post the <c>WM_QUIT</c> message using the <c>PostMessage</c> function; use <c>PostQuitMessage</c>.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-quit
WM_QUIT = 0x0012,
/// <summary>
/// <para>
/// Sent when the window background must be erased (for example, when a window is resized). The message is sent to prepare an
/// invalidated portion of a window for painting.
/// </para>
/// <para>
/// <code>#define WM_ERASEBKGND 0x0014</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the device context.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return nonzero if it erases the background; otherwise, it should return zero.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function erases the background by using the class background brush specified by the
/// <c>hbrBackground</c> member of the <c>WNDCLASS</c> structure. If <c>hbrBackground</c> is <c>NULL</c>, the application should
/// process the <c>WM_ERASEBKGND</c> message and erase the background.
/// </para>
/// <para>
/// An application should return nonzero in response to <c>WM_ERASEBKGND</c> if it processes the message and erases the
/// background; this indicates that no further erasing is required. If the application returns zero, the window will remain
/// marked for erasing. (Typically, this indicates that the <c>fErase</c> member of the <c>PAINTSTRUCT</c> structure will be <c>TRUE</c>.)
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-erasebkgnd
WM_ERASEBKGND = 0x0014,
/// <summary>
/// <para>The <c>WM_SYSCOLORCHANGE</c> message is sent to all top-level windows when a change is made to a system color setting.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <remarks>
/// <para>The system sends a <c>WM_PAINT</c> message to any window that is affected by a system color change.</para>
/// <para>
/// Applications that have brushes using the existing system colors should delete those brushes and re-create them using the new
/// system colors.
/// </para>
/// <para>
/// Top level windows that use common controls must forward the <c>WM_SYSCOLORCHANGE</c> message to the controls; otherwise, the
/// controls will not be notified of the color change. This ensures that the colors used by your common controls are consistent
/// with those used by other user interface objects. For example, a toolbar control uses the "3D Objects" color to draw its
/// buttons. If the user changes the 3D Objects color but the <c>WM_SYSCOLORCHANGE</c> message is not forwarded to the toolbar,
/// the toolbar buttons will remain in their original color while the color of other buttons in the system changes.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-syscolorchange
WM_SYSCOLORCHANGE = 0x0015,
/// <summary>
/// <para>Sent to a window when the window is about to be hidden or shown.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_SHOWWINDOW 0x0018</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Indicates whether a window is being shown. If wParam is <c>TRUE</c>, the window is being shown. If wParam is <c>FALSE</c>,
/// the window is being hidden.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The status of the window being shown. If lParam is zero, the message was sent because of a call to the <c>ShowWindow</c>
/// function; otherwise, lParam is one of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SW_OTHERUNZOOM</c> 4</term>
/// <term>The window is being uncovered because a maximize window was restored or minimized.</term>
/// </item>
/// <item>
/// <term><c>SW_OTHERZOOM</c> 2</term>
/// <term>The window is being covered by another window that has been maximized.</term>
/// </item>
/// <item>
/// <term><c>SW_PARENTCLOSING</c> 1</term>
/// <term>The window's owner window is being minimized.</term>
/// </item>
/// <item>
/// <term><c>SW_PARENTOPENING</c> 3</term>
/// <term>The window's owner window is being restored.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function hides or shows the window, as specified by the message. If a window has the
/// <c>WS_VISIBLE</c> style when it is created, the window receives this message after it is created, but before it is displayed.
/// A window also receives this message when its visibility state is changed by the <c>ShowWindow</c> or <c>ShowOwnedPopups</c> function.
/// </para>
/// <para>The <c>WM_SHOWWINDOW</c> message is not sent under the following circumstances:</para>
/// <list type="bullet">
/// <item>
/// <term>When a top-level, overlapped window is created with the <c>WS_MAXIMIZE</c> or <c>WS_MINIMIZE</c> style.</term>
/// </item>
/// <item>
/// <term>When the <c>SW_SHOWNORMAL</c> flag is specified in the call to the <c>ShowWindow</c> function.</term>
/// </item>
/// </list>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-showwindow
WM_SHOWWINDOW = 0x0018,
/// <summary>
/// <para>
/// An application sends the <c>WM_WININICHANGE</c> message to all top-level windows after making a change to the WIN.INI file.
/// The <c>SystemParametersInfo</c> function sends this message after an application uses the function to change a setting in WIN.INI.
/// </para>
/// <para>
/// <para>Note</para>
/// <para>
/// The <c>WM_WININICHANGE</c> message is provided only for compatibility with earlier versions of the system. Applications
/// should use the <c>WM_SETTINGCHANGE</c> message.
/// </para>
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_WININICHANGE 0x001A</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a string containing the name of the system parameter that was changed. For example, this string can be the name
/// of a registry key or the name of a section in the Win.ini file. This parameter is not particularly useful in determining
/// which system parameter changed. For example, when the string is a registry name, it typically indicates only the leaf node in
/// the registry, not the whole path. In addition, some applications send this message with lParam set to <c>NULL</c>. In
/// general, when you receive this message, you should check and reload any system parameter settings that are used by your application.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If you process this message, return zero.</para>
/// <remarks>
/// <para>
/// To send the <c>WM_WININICHANGE</c> message to all top-level windows, use the <c>SendMessage</c> function with the hWnd
/// parameter set to <c>HWND_BROADCAST</c>.
/// </para>
/// <para>
/// Calls to functions that change WIN.INI may be mapped to the registry instead. This mapping occurs when WIN.INI and the
/// section being changed are specified in the registry under the following key:
/// </para>
/// <para><c>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping</c></para>
/// <para>The change in the storage location has no effect on the behavior of this message.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-wininichange
WM_WININICHANGE = 0x001A,
/// <summary>
/// <para>
/// A message that is sent to all top-level windows when the <c>SystemParametersInfo</c> function changes a system-wide setting
/// or when policy settings have changed.
/// </para>
/// <para>
/// Applications should send <c>WM_SETTINGCHANGE</c> to all top-level windows when they make changes to system parameters. (This
/// message cannot be sent directly to a window.) To send the <c>WM_SETTINGCHANGE</c> message to all top-level windows, use the
/// <c>SendMessageTimeout</c> function with the hwnd parameter set to <c>HWND_BROADCAST</c>.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_WININICHANGE 0x001A #define WM_SETTINGCHANGE WM_WININICHANGE</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// When the system sends this message as a result of a <c>SystemParametersInfo</c> call, the wParam parameter is the value of
/// the uiAction parameter passed to the <c>SystemParametersInfo</c> function. For a list of values, see <c>SystemParametersInfo</c>.
/// </para>
/// <para>
/// When the system sends this message as a result of a change in policy settings, this parameter indicates the type of policy
/// that was applied. This value is 1 if computer policy was applied or zero if user policy was applied.
/// </para>
/// <para>When the system sends this message as a result of a change in locale settings, this parameter is zero.</para>
/// <para>When an application sends this message, this parameter must be <c>NULL</c>.</para>
/// <para><em>lParam</em></para>
/// <para>
/// When the system sends this message as a result of a <c>SystemParametersInfo</c> call, lParam is a pointer to a string that
/// indicates the area containing the system parameter that was changed. This parameter does not usually indicate which specific
/// system parameter changed. (Note that some applications send this message with lParam set to <c>NULL</c>.) In general, when
/// you receive this message, you should check and reload any system parameter settings that are used by your application.
/// </para>
/// <para>
/// This string can be the name of a registry key or the name of a section in the Win.ini file. When the string is a registry
/// name, it typically indicates only the leaf node in the registry, not the full path.
/// </para>
/// <para>
/// When the system sends this message as a result of a change in policy settings, this parameter points to the string "Policy".
/// </para>
/// <para>
/// When the system sends this message as a result of a change in locale settings, this parameter points to the string "intl".
/// </para>
/// <para>
/// To effect a change in the environment variables for the system or the user, broadcast this message with lParam set to the
/// string "Environment".
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If you process this message, return zero.</para>
/// <remarks>
/// The lParam parameter indicates which system metric has changed, for example, "ConvertibleSlateMode" if the
/// CONVERTIBLESLATEMODE indicator was toggled or "SystemDockMode" if the DOCKED indicator was toggled.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settingchange
WM_SETTINGCHANGE = WM_WININICHANGE,
/// <summary>
/// <para>The <c>WM_DEVMODECHANGE</c> message is sent to all top-level windows whenever the user changes device-mode settings.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to a window.</para>
/// <para><em>uMsg</em></para>
/// <para>WM_DEVMODECHANGE</para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a string that specifies the device name.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// This message cannot be sent directly to a window. To send the <c>WM_DEVMODECHANGE</c> message to all top-level windows, use
/// the <c>SendMessageTimeout</c> function with the hWnd parameter set to HWND_BROADCAST.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-devmodechange
WM_DEVMODECHANGE = 0x001B,
/// <summary>
/// <para>
/// Sent when a window belonging to a different application than the active window is about to be activated. The message is sent
/// to the application whose window is being activated and to the application whose window is being deactivated.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_ACTIVATEAPP 0x001C</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Indicates whether the window is being activated or deactivated. This parameter is <c>TRUE</c> if the window is being
/// activated; it is <c>FALSE</c> if the window is being deactivated.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The thread identifier. If the wParam parameter is <c>TRUE</c>, lParam is the identifier of the thread that owns the window
/// being deactivated. If wParam is <c>FALSE</c>, lParam is the identifier of the thread that owns the window being activated.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-activateapp
WM_ACTIVATEAPP = 0x001C,
/// <summary>
/// <para>
/// An application sends the <c>WM_FONTCHANGE</c> message to all top-level windows in the system after changing the pool of font resources.
/// </para>
/// <para>To send this message, call the <c>SendMessage</c> function with the following parameters.</para>
/// <para>
/// <code>SendMessage( (HWND) hWnd, WM_FONTCHANGE, (WPARAM) wParam, (LPARAM) lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <remarks>
/// <para>
/// An application that adds or removes fonts from the system (for example, by using the <c>AddFontResource</c> or
/// <c>RemoveFontResource</c> function) should send this message to all top-level windows.
/// </para>
/// <para>
/// To send the <c>WM_FONTCHANGE</c> message to all top-level windows, an application can call the <c>SendMessage</c> function
/// with the hwnd parameter set to HWND_BROADCAST.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-fontchange
WM_FONTCHANGE = 0x001D,
/// <summary>
/// <para>A message that is sent whenever there is a change in the system time.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // not used; must be zero LPARAM lParam // not used; must be zero );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>uMsg</em></para>
/// <para><c>WM_TIMECHANGE</c> identifier.</para>
/// <para><em>wParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// An application should not broadcast this message, because the system will broadcast this message when the application changes
/// the system time.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/sysinfo/wm-timechange
WM_TIMECHANGE = 0x001E,
/// <summary>
/// <para>
/// Sent to cancel certain modes, such as mouse capture. For example, the system sends this message to the active window when a
/// dialog box or message box is displayed. Certain functions also send this message explicitly to the specified window
/// regardless of whether it is the active window. For example, the <c>EnableWindow</c> function sends this message when
/// disabling the specified window.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_CANCELMODE 0x001F</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// When the <c>WM_CANCELMODE</c> message is sent, the <c>DefWindowProc</c> function cancels internal processing of standard
/// scroll bar input, cancels internal menu processing, and releases the mouse capture.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-cancelmode
WM_CANCELMODE = 0x001F,
/// <summary>
/// <para>Sent to a window if the mouse causes the cursor to move within a window and mouse input is not captured.</para>
/// <para>
/// <code>#define WM_SETCURSOR 0x0020</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window that contains the cursor.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word of lParam specifies the hit-test result for the cursor position. See the return values for WM_NCHITTEST
/// for possible values.
/// </para>
/// <para>
/// The high-order word of lParam specifies the mouse window message which triggered this event, such as WM_MOUSEMOVE. When the
/// window enters menu mode, this value is zero.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c> to halt further processing or <c>FALSE</c> to continue.
/// </para>
/// <remarks>
/// The <c>DefWindowProc</c> function passes the <c>WM_SETCURSOR</c> message to a parent window before processing. If the parent
/// window returns <c>TRUE</c>, further processing is halted. Passing the message to a window's parent window gives the parent
/// window control over the cursor's setting in a child window. The <c>DefWindowProc</c> function also uses this message to set
/// the cursor to an arrow if it is not in the client area, or to the registered class cursor if it is in the client area. If the
/// low-order word of the lParam parameter is <c>HTERROR</c> and the high-order word of lParam specifies that one of the mouse
/// buttons is pressed, <c>DefWindowProc</c> calls the <c>MessageBeep</c> function.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-setcursor
WM_SETCURSOR = 0x0020,
/// <summary>
/// <para>
/// Sent when the cursor is in an inactive window and the user presses a mouse button. The parent window receives this message
/// only if the child window passes it to the <c>DefWindowProc</c> function.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOUSEACTIVATE 0x0021</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the top-level parent window of the window being activated.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the
/// <c>WM_NCHITTEST</c> message. For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para>
/// The high-order word specifies the identifier of the mouse message generated when the user pressed a mouse button. The mouse
/// message is either discarded or posted to the window, depending on the return value.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value specifies whether the window should be activated and whether the identifier of the mouse message should be
/// discarded. It must be one of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>MA_ACTIVATE</c> 1</term>
/// <term>Activates the window, and does not discard the mouse message.</term>
/// </item>
/// <item>
/// <term><c>MA_ACTIVATEANDEAT</c> 2</term>
/// <term>Activates the window, and discards the mouse message.</term>
/// </item>
/// <item>
/// <term><c>MA_NOACTIVATE</c> 3</term>
/// <term>Does not activate the window, and does not discard the mouse message.</term>
/// </item>
/// <item>
/// <term><c>MA_NOACTIVATEANDEAT</c> 4</term>
/// <term>Does not activate the window, but discards the mouse message.</term>
/// </item>
/// </list>
/// <remarks>
/// The <c>DefWindowProc</c> function passes the message to a child window's parent window before any processing occurs. The
/// parent window determines whether to activate the child window. If it activates the child window, the parent window should
/// return <c>MA_NOACTIVATE</c> or <c>MA_NOACTIVATEANDEAT</c> to prevent the system from processing the message further.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mouseactivate
WM_MOUSEACTIVATE = 0x0021,
/// <summary>
/// <para>Sent to a child window when the user clicks the window's title bar or when the window is activated, moved, or sized.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_CHILDACTIVATE 0x0022</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-childactivate
WM_CHILDACTIVATE = 0x0022,
/// <summary>
/// <para>
/// Sent by a computer-based training (CBT) application to separate user-input messages from other messages sent through the
/// <c>WH_JOURNALPLAYBACK</c> procedure.
/// </para>
/// <para>
/// <code>#define WM_QUEUESYNC 0x0023</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>void</c></para>
/// <para>A CBT application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// Whenever a CBT application uses the <c>WH_JOURNALPLAYBACK</c> procedure, the first and last messages are <c>WM_QUEUESYNC</c>.
/// This allows the CBT application to intercept and examine user-initiated messages without doing so for events that it sends.
/// </para>
/// <para>If an application specifies a <c>NULL</c> window handle, the message is posted to the message queue of the active window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-queuesync
WM_QUEUESYNC = 0x0023,
/// <summary>
/// <para>
/// Sent to a window when the size or position of the window is about to change. An application can use this message to override
/// the window's default maximized size and position, or its default minimum or maximum tracking size.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_GETMINMAXINFO 0x0024</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>MINMAXINFO</c> structure that contains the default maximized position and dimensions, and the default
/// minimum and maximum tracking sizes. An application can override the defaults by setting the members of this structure.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// The maximum tracking size is the largest window size that can be produced by using the borders to size the window. The
/// minimum tracking size is the smallest window size that can be produced by using the borders to size the window.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
WM_GETMINMAXINFO = 0x0024,
/// <summary>
/// <para>
/// The WM_PAINTICON message is sent to a minimized window when the icon is to be painted but only if the application is written
/// for Windows 3.x. A window receives this message only if a class icon is defined for the window; otherwise, WM_PAINT is sent instead.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_PAINTICON 0x0026</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// The DefWindowProc function draws the class icon. For compatibility with Windows 3.x, wParam is TRUE. However, this value has
/// no significance.
/// </remarks>
WM_PAINTICON = 0x0026,
/// <summary>
/// <para>
/// The WM_ICONERASEBKGND message is sent to a minimized window when the background of the icon must be filled before painting
/// the icon. A window receives this message only if a class icon is defined for the window; otherwise, WM_ERASEBKGND is sent.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_ICONERASEBKGND 0x0027</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Type: HDC. Identifies the device context of the icon.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>The DefWindowProc function fills the icon background with the class background brush of the parent window.</remarks>
WM_ICONERASEBKGND = 0x0027,
/// <summary>
/// <para>Sent to a dialog box procedure to set the keyboard focus to a different control in the dialog box.</para>
/// <para>
/// <code>#define WM_NEXTDLGCTL 0x0028</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// If lParam is <c>TRUE</c>, this parameter identifies the control that receives the focus. If lParam is <c>FALSE</c>, this
/// parameter indicates whether the next or previous control with the <c>WS_TABSTOP</c> style receives the focus. If wParam is
/// zero, the next control receives the focus; otherwise, the previous control with the <c>WS_TABSTOP</c> style receives the focus.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word indicates how the system uses wParam. If the low-order word is <c>TRUE</c>, wParam is a handle associated
/// with the control that receives the focus; otherwise, wParam is a flag that indicates whether the next or previous control
/// with the <c>WS_TABSTOP</c> style receives the focus.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// This message performs additional dialog box management operations beyond those performed by the <c>SetFocus</c> function
/// <c>WM_NEXTDLGCTL</c> updates the default pushbutton border, sets the default control identifier, and automatically selects
/// the text of an edit control (if the target window is an edit control).
/// </para>
/// <para>
/// Do not use the <c>SendMessage</c> function to send a <c>WM_NEXTDLGCTL</c> message if your application will concurrently
/// process other messages that set the focus. Use the <c>PostMessage</c> function instead.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dlgbox/wm-nextdlgctl
WM_NEXTDLGCTL = 0x0028,
/// <summary>
/// <para>
/// The <c>WM_SPOOLERSTATUS</c> message is sent from Print Manager whenever a job is added to or removed from the Print Manager queue.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The PR_JOBSTATUS flag.</para>
/// <para><em>lParam</em></para>
/// <para>The low-order word specifies the number of jobs remaining in the Print Manager queue.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// This message is for informational purposes only. This message is advisory and does not have guaranteed delivery semantics.
/// Applications should not assume that they will receive a WM_SPOOLERSTATUS message for every change in spooler status.
/// </para>
/// <para>
/// The WM_SPOOLERSTATUS message is not supported after Windows XP. To be notified of changes to the print queue status, you can
/// use <c>FindFirstPrinterChangeNotification</c> and <c>FindNextPrinterChangeNotification</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/printdocs/wm-spoolerstatus
WM_SPOOLERSTATUS = 0x002A,
/// <summary>
/// <para>
/// Sent to the parent window of an owner-drawn button, combo box, list box, or menu when a visual aspect of the button, combo
/// box, list box, or menu has changed.
/// </para>
/// <para>A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>WM_DRAWITEM WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Specifies the identifier of the control that sent the <c>WM_DRAWITEM</c> message. If the message was sent by a menu, this
/// parameter is zero.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// Pointer to a <c>DRAWITEMSTRUCT</c> structure containing information about the item to be drawn and the type of drawing required.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return <c>TRUE</c>.</para>
/// <remarks>
/// <para>By default, the <c>DefWindowProc</c> function draws the focus rectangle for an owner-drawn list box item.</para>
/// <para>
/// The itemAction member of the <c>DRAWITEMSTRUCT</c> structure specifies the drawing operation that an application should perform.
/// </para>
/// <para>
/// Before returning from processing this message, an application should ensure that the device context identified by the hDC
/// member of the <c>DRAWITEMSTRUCT</c> structure is in the default state.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-drawitem
WM_DRAWITEM = 0x002B,
/// <summary>
/// <para>Sent to the owner window of a combo box, list box, list-view control, or menu item when the control or menu is created.</para>
/// <para>A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>WM_MEASUREITEM WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Contains the value of the <c>CtlID</c> member of the <c>MEASUREITEMSTRUCT</c> structure pointed to by the lParam parameter.
/// This value identifies the control that sent the <c>WM_MEASUREITEM</c> message. If the message was sent by a menu, this
/// parameter is zero. If the value is nonzero or the value is zero and the value of the <c>CtlType</c> member of the
/// <c>MEASUREITEMSTRUCT</c> pointed to by lParam is not <c>ODT_MENU</c>, the message was sent by a combo box or by a list box.
/// If the value is nonzero, and the value of the <c>itemID</c> member of the <c>MEASUREITEMSTRUCT</c> pointed to by lParam is
/// (UINT) 1, the message was sent by a combo edit field.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Pointer to a <c>MEASUREITEMSTRUCT</c> structure that contains the dimensions of the owner-drawn control or menu item.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return <c>TRUE</c>.</para>
/// <remarks>
/// <para>
/// When the owner window receives the <c>WM_MEASUREITEM</c> message, the owner fills in the <c>MEASUREITEMSTRUCT</c> structure
/// pointed to by the lParam parameter of the message and returns; this informs the system of the dimensions of the control. If a
/// list box or combo box is created with the <c>LBS_OWNERDRAWVARIABLE</c> or <c>CBS_OWNERDRAWVARIABLE</c> style, this message is
/// sent to the owner for each item in the control; otherwise, this message is sent once.
/// </para>
/// <para>
/// The system sends the <c>WM_MEASUREITEM</c> message to the owner window of combo boxes and list boxes created with the
/// OWNERDRAWFIXED style before sending the <c>WM_INITDIALOG</c> message. As a result, when the owner receives this message, the
/// system has not yet determined the height and width of the font used in the control; function calls and calculations requiring
/// these values should occur in the main function of the application or library.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-measureitem
WM_MEASUREITEM = 0x002C,
/// <summary>
/// <para>
/// Sent to the owner of a list box or combo box when the list box or combo box is destroyed or when items are removed by the
/// <c>LB_DELETESTRING</c>, <c>LB_RESETCONTENT</c>, <c>CB_DELETESTRING</c>, or <c>CB_RESETCONTENT</c> message. The system sends a
/// <c>WM_DELETEITEM</c> message for each deleted item. The system sends the <c>WM_DELETEITEM</c> message for any deleted list
/// box or combo box item with nonzero item data.
/// </para>
/// <para>
/// <code>WM_DELETEITEM WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Specifies the identifier of the control that sent the <c>WM_DELETEITEM</c> message.</para>
/// <para><em>lParam</em></para>
/// <para>Pointer to a <c>DELETEITEMSTRUCT</c> structure that contains information about the item deleted from a list box.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return <c>TRUE</c> if it processes this message.</para>
/// <remarks>
/// <para>
/// Microsoft Windows NT and later: Windows sends a <c>WM_DELETEITEM</c> message only for items deleted from an owner-drawn list
/// box (with the <c>LBS_OWNERDRAWFIXED</c> or <c>LBS_OWNERDRAWVARIABLE</c> style) or owner-drawn combo box (with the
/// <c>CBS_OWNERDRAWFIXED</c> or <c>CBS_OWNERDRAWVARIABLE</c> style).
/// </para>
/// <para>
/// Windows 95: Windows sends the <c>WM_DELETEITEM</c> message for any deleted list box or combo box item with nonzero item data.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-deleteitem
WM_DELETEITEM = 0x002D,
/// <summary>
/// <para>Sent by a list box with the <c>LBS_WANTKEYBOARDINPUT</c> style to its owner in response to a <c>WM_KEYDOWN</c> message.</para>
/// <para>
/// <code>WM_VKEYTOITEM WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The <c>LOWORD</c> specifies the virtual-key code of the key the user pressed. The <c>HIWORD</c> specifies the current
/// position of the caret.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Handle to the list box.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value specifies the action that the application performed in response to the message. A return value of -2
/// indicates that the application handled all aspects of selecting the item and requires no further action by the list box. (See
/// Remarks.) A return value of -1 indicates that the list box should perform the default action in response to the keystroke. A
/// return value of 0 or greater specifies the index of an item in the list box and indicates that the list box should perform
/// the default action for the keystroke on the specified item.
/// </para>
/// <remarks>
/// <para>
/// A return value of -2 is valid only for keys that are not translated into characters by the list box control. If the
/// <c>WM_KEYDOWN</c> message translates to a <c>WM_CHAR</c> message and the application processes the <c>WM_VKEYTOITEM</c>
/// message generated as a result of the key press, the list box ignores the return value and does the default processing for
/// that character). <c>WM_KEYDOWN</c> messages generated by keys such as VK_UP, VK_DOWN, VK_NEXT, and VK_PREVIOUS are not
/// translated to <c>WM_CHAR</c> messages. In such cases, trapping the <c>WM_VKEYTOITEM</c> message and returning -2 prevents the
/// list box from doing the default processing for that key.
/// </para>
/// <para>
/// To trap keys that generate a char message and do special processing, the application must subclass the list box, trap both
/// the <c>WM_KEYDOWN</c> and <c>WM_CHAR</c> messages, and process the messages appropriately in the subclass procedure.
/// </para>
/// <para>
/// The preceding remarks apply to regular list boxes that are created with the <c>LBS_WANTKEYBOARDINPUT</c> style. If the list
/// box is owner-drawn, the application must process the <c>WM_CHARTOITEM</c> message.
/// </para>
/// <para>The <c>DefWindowProc</c> function returns -1.</para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>BOOL</c> and return the value
/// directly. The DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-vkeytoitem
WM_VKEYTOITEM = 0x002E,
/// <summary>
/// <para>Sent by a list box with the <c>LBS_WANTKEYBOARDINPUT</c> style to its owner in response to a <c>WM_CHAR</c> message.</para>
/// <para>
/// <code>WM_CHARTOITEM WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The <c>LOWORD</c> specifies the character code of the key the user pressed. The <c>HIWORD</c> specifies the current position
/// of the caret.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Handle to the list box.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value specifies the action that the application performed in response to the message. A return value of -1 or -2
/// indicates that the application handled all aspects of selecting the item and requires no further action by the list box. A
/// return value of 0 or greater specifies the zero-based index of an item in the list box and indicates that the list box should
/// perform the default action for the keystroke on the specified item.
/// </para>
/// <remarks>
/// <para>The <c>DefWindowProc</c> function returns -1.</para>
/// <para>Only owner-drawn list boxes that do not have the <c>LBS_HASSTRINGS</c> style can receive this message.</para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>BOOL</c> and return the value
/// directly. The DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-chartoitem
WM_CHARTOITEM = 0x002F,
/// <summary>
/// <para>Sets the font that a control is to use when drawing text.</para>
/// <para>
/// <code>#define WM_SETFONT 0x0030</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// A handle to the font ( <c>HFONT</c>). If this parameter is <c>NULL</c>, the control uses the default system font to draw text.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word of lParam specifies whether the control should be redrawn immediately upon setting the font. If this
/// parameter is <c>TRUE</c>, the control redraws itself.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>This message does not return a value.</para>
/// <remarks>
/// <para>The <c>WM_SETFONT</c> message applies to all controls, not just those in dialog boxes.</para>
/// <para>
/// The best time for the owner of a dialog box control to set the font of the control is when it receives the
/// <c>WM_INITDIALOG</c> message. The application should call the <c>DeleteObject</c> function to delete the font when it is no
/// longer needed; for example, after it destroys the control.
/// </para>
/// <para>
/// The size of the control does not change as a result of receiving this message. To avoid clipping text that does not fit
/// within the boundaries of the control, the application should correct the size of the control window before it sets the font.
/// </para>
/// <para>
/// When a dialog box uses the DS_SETFONT style to set the text in its controls, the system sends the <c>WM_SETFONT</c> message
/// to the dialog box procedure before it creates the controls. An application can create a dialog box that contains the
/// DS_SETFONT style by calling any of the following functions:
/// </para>
/// <list type="bullet">
/// <item>
/// <term><c>CreateDialogIndirect</c></term>
/// </item>
/// <item>
/// <term><c>CreateDialogIndirectParam</c></term>
/// </item>
/// <item>
/// <term><c>DialogBoxIndirect</c></term>
/// </item>
/// <item>
/// <term><c>DialogBoxIndirectParam</c></term>
/// </item>
/// </list>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-setfont
WM_SETFONT = 0x0030,
/// <summary>
/// <para>Retrieves the font with which the control is currently drawing its text.</para>
/// <para>
/// <code>#define WM_GETFONT 0x0031</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>HFONT</c></para>
/// <para>The return value is a handle to the font used by the control, or <c>NULL</c> if the control is using the system font.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getfont
WM_GETFONT = 0x0031,
/// <summary>
/// <para>
/// Sent to a window to associate a hot key with the window. When the user presses the hot key, the system activates the window.
/// </para>
/// <para>
/// <code>#define WM_SETHOTKEY 0x0032</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word specifies the virtual-key code to associate with the window.</para>
/// <para>The high-order word can be one or more of the following values from CommCtrl.h.</para>
/// <para>Setting wParam to <c>NULL</c> removes the hot key associated with a window.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>HOTKEYF_ALT</c> 0x04</term>
/// <term>ALT key</term>
/// </item>
/// <item>
/// <term><c>HOTKEYF_CONTROL</c> 0x02</term>
/// <term>CTRL key</term>
/// </item>
/// <item>
/// <term><c>HOTKEYF_EXT</c> 0x08</term>
/// <term>Extended key</term>
/// </item>
/// <item>
/// <term><c>HOTKEYF_SHIFT</c> 0x01</term>
/// <term>SHIFT key</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>The return value is one of the following.</para>
/// <list type="table">
/// <listheader>
/// <term>Return value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>-1</term>
/// <term>The function is unsuccessful; the hot key is invalid.</term>
/// </item>
/// <item>
/// <term>0</term>
/// <term>The function is unsuccessful; the window is invalid.</term>
/// </item>
/// <item>
/// <term>1</term>
/// <term>The function is successful, and no other window has the same hot key.</term>
/// </item>
/// <item>
/// <term>2</term>
/// <term>The function is successful, but another window already has the same hot key.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>A hot key cannot be associated with a child window.</para>
/// <para><c>VK_ESCAPE</c>, <c>VK_SPACE</c>, and <c>VK_TAB</c> are invalid hot keys.</para>
/// <para>
/// When the user presses the hot key, the system generates a <c>WM_SYSCOMMAND</c> message with wParam equal to <c>SC_HOTKEY</c>
/// and lParam equal to the window's handle. If this message is passed on to <c>DefWindowProc</c>, the system will bring the
/// window's last active popup (if it exists) or the window itself (if there is no popup window) to the foreground.
/// </para>
/// <para>
/// A window can only have one hot key. If the window already has a hot key associated with it, the new hot key replaces the old
/// one. If more than one window has the same hot key, the window that is activated by the hot key is random.
/// </para>
/// <para>These hot keys are unrelated to the hot keys set by <c>RegisterHotKey</c>.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-sethotkey
WM_SETHOTKEY = 0x0032,
/// <summary>
/// <para>Sent to determine the hot key associated with a window.</para>
/// <para>
/// <code>#define WM_GETHOTKEY 0x0033</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value is the virtual-key code and modifiers for the hot key, or <c>NULL</c> if no hot key is associated with the
/// window. The virtual-key code is in the low byte of the return value and the modifiers are in the high byte. The modifiers can
/// be a combination of the following flags from CommCtrl.h.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>HOTKEYF_ALT</c> 0x04</term>
/// <term>ALT key</term>
/// </item>
/// <item>
/// <term><c>HOTKEYF_CONTROL</c> 0x02</term>
/// <term>CTRL key</term>
/// </item>
/// <item>
/// <term><c>HOTKEYF_EXT</c> 0x08</term>
/// <term>Extended key</term>
/// </item>
/// <item>
/// <term><c>HOTKEYF_SHIFT</c> 0x01</term>
/// <term>SHIFT key</term>
/// </item>
/// </list>
/// <remarks>These hot keys are unrelated to the hot keys set by the <c>RegisterHotKey</c> function.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-gethotkey
WM_GETHOTKEY = 0x0033,
/// <summary>
/// <para>
/// Sent to a minimized (iconic) window. The window is about to be dragged by the user but does not have an icon defined for its
/// class. An application can return a handle to an icon or cursor. The system displays this cursor or icon while the user drags
/// the icon.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_QUERYDRAGICON 0x0037</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// An application should return a handle to a cursor or icon that the system is to display while the user drags the icon. The
/// cursor or icon must be compatible with the display driver's resolution. If the application returns <c>NULL</c>, the system
/// displays the default cursor.
/// </para>
/// <remarks>
/// <para>
/// When the user drags the icon of a window without a class icon, the system replaces the icon with a default cursor. If the
/// application requires a different cursor to be displayed during dragging, it must return a handle to the cursor or icon
/// compatible with the display driver's resolution. If an application returns a handle to a color cursor or icon, the system
/// converts the cursor or icon to black and white. The application can call the <c>LoadCursor</c> or <c>LoadIcon</c> function to
/// load a cursor or icon from the resources in its executable (.exe) file and to retrieve this handle.
/// </para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>BOOL</c> and return the value
/// directly. The <c>DWL_MSGRESULT</c> value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-querydragicon
WM_QUERYDRAGICON = 0x0037,
/// <summary>
/// <para>
/// Sent to determine the relative position of a new item in the sorted list of an owner-drawn combo box or list box. Whenever
/// the application adds a new item, the system sends this message to the owner of a combo box or list box created with the
/// <c>CBS_SORT</c> or <c>LBS_SORT</c> style.
/// </para>
/// <para>
/// <code>WM_COMPAREITEM WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Specifies the identifier of the control that sent the <c>WM_COMPAREITEM</c> message.</para>
/// <para><em>lParam</em></para>
/// <para>
/// Pointer to a <c>COMPAREITEMSTRUCT</c> structure that contains the identifiers and application-supplied data for two items in
/// the combo or list box.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value indicates the relative position of the two items. It may be any of the values shown in the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>Value</c></term>
/// <term>Meaning</term>
/// </item>
/// <item>
/// <term><c>-1</c></term>
/// <term>Item 1 precedes item 2 in the sorted order.</term>
/// </item>
/// <item>
/// <term><c>0</c></term>
/// <term>Items 1 and 2 are equivalent in the sorted order.</term>
/// </item>
/// <item>
/// <term><c>1</c></term>
/// <term>Item 1 follows item 2 in the sorted order.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// When the owner of an owner-drawn combo box or list box receives this message, the owner returns a value indicating which of
/// the items specified by the <c>COMPAREITEMSTRUCT</c> structure will appear before the other. Typically, the system sends this
/// message several times until it determines the exact position for the new item.
/// </para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>BOOL</c> and return the value
/// directly. The DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-compareitem
WM_COMPAREITEM = 0x0039,
/// <summary>
/// <para>
/// Sent by both Microsoft Active Accessibility and Microsoft UI Automation to obtain information about an accessible object
/// contained in a server application.
/// </para>
/// <para>
/// Applications never send this message directly. Microsoft Active Accessibility sends this message in response to calls to
/// <c>AccessibleObjectFromPoint</c>, <c>AccessibleObjectFromEvent</c>, or <c>AccessibleObjectFromWindow</c>. However, server
/// applications handle this message. UI Automation sends this message in response to calls to
/// <c>IUIAutomation::ElementFromHandle</c>, <c>ElementFromPoint</c>, and <c>GetFocusedElement</c>, and when handling events for
/// which a client has registered.
/// </para>
/// <para>
/// <code>dwFlags = (WPARAM)(DWORD) wParam; dwObjId = (LPARAM)(DWORD) lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>dwFlags</em></para>
/// <para>
/// Provides additional information about the message and is used only by the system. Servers pass dwFlags as the wParam
/// parameter in the call to <c>LresultFromObject</c> when handling the message.
/// </para>
/// <para><em>dwObjId</em></para>
/// <para>
/// Object identifier. This value is one of the object identifier constants or a custom object identifier. A server application
/// must check this value to identify the type of information being requested. Before comparing this value against the OBJID_
/// values, the server must cast it to <c>DWORD</c>; otherwise, on 64-bit Windows, the sign extension of the lParam can interfere
/// with the comparison.
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// If dwObjId is one of the OBJID_ values such as <c>OBJID_CLIENT</c>, the request is for a Microsoft Active Accessibility
/// object that implements <c>IAccessible</c>.
/// </term>
/// </item>
/// <item>
/// <term>
/// If dwObjId is equal to <c>UiaRootObjectId</c>, the request is for a UI Automation provider. If the server is implementing UI
/// Automation, it should return a provider using the <c>UiaReturnRawElementProvider</c> function.
/// </term>
/// </item>
/// <item>
/// <term>
/// If dwObjId is <c>OBJID_NATIVEOM</c>, the request is for the control's underlying object model. If the control supports this
/// request, it should return an appropriate COM interface by calling the <c>LresultFromObject</c> function.
/// </term>
/// </item>
/// <item>
/// <term>
/// If dwObjId is <c>OBJID_QUERYCLASSNAMEIDX</c>, the request is for the control to identify itself as a standard Windows control
/// or a common control implemented by the common control library (ComCtrl.dll).
/// </term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>
/// If the window or control does not need to respond to this message, it should pass the message to the <c>DefWindowProc</c>
/// function; otherwise, the window or control should return a value that corresponds to the request specified by dwObjId:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// If the window or control implements UI Automation, the window or control should return the value obtained by a call to the
/// <c>UiaReturnRawElementProvider</c> function.
/// </term>
/// </item>
/// <item>
/// <term>
/// If dwObjId is <c>OBJID_NATIVEOM</c> and the window exposes a native Object Model, the windows should return the value
/// obtained by a call to the <c>LresultFromObject</c> function.
/// </term>
/// </item>
/// <item>
/// <term>
/// If dwObjId is <c>OBJID_CLIENT</c> and the window implements <c>IAccessible</c>, the window should return the value obtained
/// by a call to the <c>LresultFromObject</c> function.
/// </term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// When a client calls <c>AccessibleObjectFromWindow</c> or any of the other <c>AccessibleObjectFrom</c> X functions that
/// retrieve an interface to an object, Microsoft Active Accessibility sends the <c>WM_GETOBJECT</c> message to the appropriate
/// window procedure within the appropriate server application. While processing <c>WM_GETOBJECT</c>, server applications call
/// <c>LresultFromObject</c> and use the return value of this function as the return value for the message. Microsoft Active
/// Accessibility, in conjunction with the COM library, performs the appropriate marshaling and passes the interface pointer from
/// the server back to the client.
/// </para>
/// <para>
/// Servers do not respond to <c>WM_GETOBJECT</c> before the object is fully initialized or after it begins to close down. When
/// an application creates a new window, the system sends <c>EVENT_OBJECT_CREATE</c> to notify clients before it sends the
/// WM_CREATE message to the application's window procedure. Because many applications use WM_CREATE to start their
/// initialization process, servers do not respond to the <c>WM_GETOBJECT</c> message until finished processing the
/// <c>WM_CREATE</c> message.
/// </para>
/// <para>A server uses <c>WM_GETOBJECT</c> to perform the following tasks:</para>
/// <list type="bullet">
/// <item>
/// <term>Create New Accessible Objects</term>
/// </item>
/// <item>
/// <term>Reuse Existing Pointers to Objects</term>
/// </item>
/// <item>
/// <term>Create New Interfaces to the Same Object</term>
/// </item>
/// </list>
/// <para>
/// For clients, this means that they might receive distinct interface pointers for the same user interface element, depending on
/// the server's action. To determine if two interface pointers point to the same user interface element, clients compare
/// <c>IAccessible</c> properties of the object. Comparing pointers does not work.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winauto/wm-getobject
WM_GETOBJECT = 0x003D,
/// <summary>
/// <para>
/// Sent to all top-level windows when the system detects more than 12.5 percent of system time over a 30- to 60-second interval
/// is being spent compacting memory. This indicates that system memory is low.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <para>Note</para>
/// <para>This message is provided only for compatibility with 16-bit Windows-based applications.</para>
/// </para>
/// <para>
/// <code>#define WM_COMPACTING 0x0041</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The ratio of central processing unit (CPU) time currently spent by the system compacting memory to CPU time currently spent
/// by the system performing other operations. For example, 0x8000 represents 50 percent of CPU time spent compacting memory.
/// </para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// When an application receives this message, it should free as much memory as possible, taking into account the current level
/// of activity of the application and the total number of applications running on the system.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-compacting
WM_COMPACTING = 0x0041,
/// <summary/>
[Obsolete]
WM_COMMNOTIFY = 0x0044,
/// <summary>
/// Sent to a window whose size, position, or place in the Z order is about to change as a result of a call to the SetWindowPos
/// function or another window-management function.
/// <para>A window receives this message through its WindowProc function.</para>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a <see cref="WINDOWPOS"/> structure that contains information about the window's new size and position.</para>
/// <para><strong>Return value</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// </summary>
/// <remarks>
/// For a window with the WS_OVERLAPPED or WS_THICKFRAME style, the DefWindowProc function sends the WM_GETMINMAXINFO message to
/// the window. This is done to validate the new size and position of the window and to enforce the CS_BYTEALIGNCLIENT and
/// CS_BYTEALIGNWINDOW client styles. By not passing the WM_WINDOWPOSCHANGING message to the DefWindowProc function, an
/// application can override these defaults.
/// <para>
/// While this message is being processed, modifying any of the values in WINDOWPOS affects the window's new size, position, or
/// place in the Z order. An application can prevent changes to the window by setting or clearing the appropriate bits in the
/// flags member of WINDOWPOS.
/// </para>
/// </remarks>
WM_WINDOWPOSCHANGING = 0x0046,
/// <summary>
/// Sent to a window whose size, position, or place in the Z order has changed as a result of a call to the SetWindowPos function
/// or another window-management function.
/// <para>A window receives this message through its WindowProc function.</para>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a <see cref="WINDOWPOS"/> structure that contains information about the window's new size and position.</para>
/// <para><strong>Return value</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// </summary>
/// <remarks>
/// By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window. The WM_SIZE and WM_MOVE messages
/// are not sent if an application handles the WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient to
/// perform any move or size change processing during the WM_WINDOWPOSCHANGED message without calling DefWindowProc.
/// </remarks>
WM_WINDOWPOSCHANGED = 0x0047,
/// <summary>
/// <para>
/// Notifies applications that the system, typically a battery-powered personal computer, is about to enter a suspended mode.
/// </para>
/// <para>
/// <para>Note</para>
/// <para>
/// The <c>WM_POWER</c> message is obsolete. It is provided only for compatibility with 16-bit Windows-based applications.
/// Applications should use the <c>WM_POWERBROADCAST</c> message.
/// </para>
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc HWND hwnd, // handle to window UINT uMsg, // WM_POWER WPARAM wParam, // power-event notification LPARAM lParam // not used );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>uMsg</em></para>
/// <para>The <c>WM_POWER</c> message identifier.</para>
/// <para><em>wParam</em></para>
/// <para>The power-event notification. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>PWR_CRITICALRESUME</c></term>
/// <term>
/// Indicates that the system is resuming operation after entering suspended mode without first broadcasting a
/// <c>PWR_SUSPENDREQUEST</c> notification message to the application. An application should perform any necessary recovery actions.
/// </term>
/// </item>
/// <item>
/// <term><c>PWR_SUSPENDREQUEST</c></term>
/// <term>Indicates that the system is about to enter suspended mode.</term>
/// </item>
/// <item>
/// <term><c>PWR_SUSPENDRESUME</c></term>
/// <term>
/// Indicates that the system is resuming operation after having entered suspended mode normally that is, the system broadcast a
/// <c>PWR_SUSPENDREQUEST</c> notification message to the application before the system was suspended. An application should
/// perform any necessary recovery actions.
/// </term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The value an application returns depends on the value of the wParam parameter. If wParam is <c>PWR_SUSPENDREQUEST</c>, the
/// return value is <c>PWR_FAIL</c> to prevent the system from entering the suspended state; otherwise, it is <c>PWR_OK</c>. If
/// wParam is <c>PWR_SUSPENDRESUME</c> or <c>PWR_CRITICALRESUME</c>, the return value is zero.
/// </para>
/// <remarks>
/// <para>
/// This message is broadcast only to an application that is running on a system that conforms to the Advanced Power Management
/// (APM) basic input/output system (BIOS) specification. The message is broadcast by the power-management driver to each window
/// returned by the <c>EnumWindows</c> function.
/// </para>
/// <para>
/// The suspended mode is the state in which the greatest amount of power savings occurs, but all operational data and parameters
/// are preserved. Random-access memory (RAM) contents are preserved, but many devices are likely to be turned off.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/power/wm-power
[Obsolete]
WM_POWER = 0x0048,
/// <summary>
/// <para>An application sends the <c>WM_COPYDATA</c> message to pass data to another application.</para>
/// <para>
/// <code>#define WM_COPYDATA 0x004A</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window passing the data.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a <c>COPYDATASTRUCT</c> structure that contains the data to be passed.</para>
/// <para><strong>Returns</strong></para>
/// <para>If the receiving application processes this message, it should return <c>TRUE</c>; otherwise, it should return <c>FALSE</c>.</para>
/// <remarks>
/// <para>
/// The data being passed must not contain pointers or other references to objects not accessible to the application receiving
/// the data.
/// </para>
/// <para>While this message is being sent, the referenced data must not be changed by another thread of the sending process.</para>
/// <para>
/// The receiving application should consider the data read-only. The lParam parameter is valid only during the processing of the
/// message. The receiving application should not free the memory referenced by lParam. If the receiving application must access
/// the data after <c>SendMessage</c> returns, it must copy the data into a local buffer.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata
WM_COPYDATA = 0x004A,
/// <summary>
/// <para>
/// Posted to an application when a user cancels the application's journaling activities. The message is posted with a
/// <c>NULL</c> window handle.
/// </para>
/// <para>
/// <code>#define WM_CANCELJOURNAL 0x004B</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>void</c></para>
/// <para>
/// This message does not return a value. It is meant to be processed from within an application's main loop or a
/// <c>GetMessage</c> hook procedure, not from a window procedure.
/// </para>
/// <remarks>
/// <para>
/// Journal record and playback modes are modes imposed on the system that let an application sequentially record or play back
/// user input. The system enters these modes when an application installs a JournalRecordProc or JournalPlaybackProc hook
/// procedure. When the system is in either of these journaling modes, applications must take turns reading input from the input
/// queue. If any one application stops reading input while the system is in a journaling mode, other applications are forced to wait.
/// </para>
/// <para>
/// To ensure a robust system, one that cannot be made unresponsive by any one application, the system automatically cancels any
/// journaling activities when a user presses CTRL+ESC or CTRL+ALT+DEL. The system then unhooks any journaling hook procedures,
/// and posts a <c>WM_CANCELJOURNAL</c> message, with a <c>NULL</c> window handle, to the application that set the journaling hook.
/// </para>
/// <para>
/// The <c>WM_CANCELJOURNAL</c> message has a <c>NULL</c> window handle, therefore it cannot be dispatched to a window procedure.
/// There are two ways for an application to see a <c>WM_CANCELJOURNAL</c> message: If the application is running in its own main
/// loop, it must catch the message between its call to <c>GetMessage</c> or <c>PeekMessage</c> and its call to
/// <c>DispatchMessage</c>. If the application is not running in its own main loop, it must set a GetMsgProc hook procedure
/// (through a call to <c>SetWindowsHookEx</c> specifying the <c>WH_GETMESSAGE</c> hook type) that watches for the message.
/// </para>
/// <para>
/// When an application sees a <c>WM_CANCELJOURNAL</c> message, it can assume two things: the user has intentionally canceled the
/// journal record or playback mode, and the system has already unhooked any journal record or playback hook procedures.
/// </para>
/// <para>
/// Note that the key combinations mentioned above (CTRL+ESC or CTRL+ALT+DEL) cause the system to cancel journaling. If any one
/// application is made unresponsive, they give the user a means of recovery. The <c>VK_CANCEL</c> virtual key code (usually
/// implemented as the CTRL+BREAK key combination) is what an application that is in journal record mode should watch for as a
/// signal that the user wishes to cancel the journaling activity. The difference is that watching for <c>VK_CANCEL</c> is a
/// suggested behavior for journaling applications, whereas CTRL+ESC or CTRL+ALT+DEL cause the system to cancel journaling
/// regardless of a journaling application's behavior.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-canceljournal
WM_CANCELJOURNAL = 0x004B,
/// <summary>Sent by a common control to its parent window when an event has occurred or the control requires some information.</summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The identifier of the common control sending the message. This identifier is not guaranteed to be unique. An application
/// should use the <c>hwndFrom</c> or <c>idFrom</c> member of the <c>NMHDR</c> structure (passed as the lParam parameter) to
/// identify the control.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to an <c>NMHDR</c> structure that contains the notification code and additional information. For some notification
/// messages, this parameter points to a larger structure that has the <c>NMHDR</c> structure as its first member.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>The return value is ignored except for notification messages that specify otherwise.</para>
/// <remarks>
/// <para>
/// The destination of the message must be the <c>HWND</c> of the parent of the control. This value can be obtained by using
/// <c>GetParent</c>, as shown in the following example, where m_controlHwnd is the <c>HWND</c> of the control itself.
/// </para>
/// <para>
/// <code>NMHDR nmh; nmh.code = CUSTOM_SELCHANGE; // Message type defined by control. nmh.idFrom = GetDlgCtrlID(m_controlHwnd); nmh.hwndFrom = m_controlHwnd; SendMessage(GetParent(m_controlHwnd), WM_NOTIFY, nmh.idFrom, (LPARAM)&amp;nmh);</code>
/// </para>
/// <para>
/// Applications handle the message in the window procedure of the parent window, as shown in the following example, which
/// handles the notification message sent by the custom control in the previous example.
/// </para>
/// <para>
/// <code>INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NOTIFY: switch (((LPNMHDR)lParam)-&gt;code) { case CUSTOM_SELCHANGE: if (((LPNMHDR)lParam)-&gt;idFrom == IDC_CUSTOMLISTBOX1) { ... // Respond to message. return TRUE; } break; ... // More cases on WM_NOTIFY switch. break; } ... // More cases on message switch. } return FALSE; }</code>
/// </para>
/// <para>
/// Some notifications, chiefly those that have been in the API for a long time, are sent as <c>WM_COMMAND</c> messages. For more
/// information, see Control Messages.
/// </para>
/// <para>
/// If the message handler is in a dialog box procedure, you must use the <c>SetWindowLong</c> function with DWL_MSGRESULT to set
/// a return value.
/// </para>
/// <para>For Windows Vista and later systems, the <c>WM_NOTIFY</c> message cannot be sent between processes.</para>
/// <para>
/// Many notifications are available in both ANSI and Unicode formats. The window sending the <c>WM_NOTIFY</c> message uses the
/// <c>WM_NOTIFYFORMAT</c> message to determine which format should be used. See <c>WM_NOTIFYFORMAT</c> for further discussion.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-notify
WM_NOTIFY = 0x004E,
/// <summary>
/// <para>
/// Posted to the window with the focus when the user chooses a new input language, either with the hotkey (specified in the
/// Keyboard control panel application) or from the indicator on the system taskbar. An application can accept the change by
/// passing the message to the <c>DefWindowProc</c> function or reject the change (and prevent it from taking place) by returning immediately.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_INPUTLANGCHANGEREQUEST 0x0050</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The new input locale. This parameter can be a combination of the following flags.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>INPUTLANGCHANGE_BACKWARD</c> 0x0004</term>
/// <term>
/// A hot key was used to choose the previous input locale in the installed list of input locales. This flag cannot be used with
/// the INPUTLANGCHANGE_FORWARD flag.
/// </term>
/// </item>
/// <item>
/// <term><c>INPUTLANGCHANGE_FORWARD</c> 0x0002</term>
/// <term>
/// A hot key was used to choose the next input locale in the installed list of input locales. This flag cannot be used with the
/// INPUTLANGCHANGE_BACKWARD flag.
/// </term>
/// </item>
/// <item>
/// <term><c>INPUTLANGCHANGE_SYSCHARSET</c> 0x0001</term>
/// <term>The new input locale's keyboard layout can be used with the system character set.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>The input locale identifier. For more information, see Languages, Locales, and Keyboard Layouts.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// This message is posted, not sent, to the application, so the return value is ignored. To accept the change, the application
/// should pass the message to <c>DefWindowProc</c>. To reject the change, the application should return zero without calling <c>DefWindowProc</c>.
/// </para>
/// <remarks>
/// <para>
/// When the <c>DefWindowProc</c> function receives the <c>WM_INPUTLANGCHANGEREQUEST</c> message, it activates the new input
/// locale and notifies the application of the change by sending the <c>WM_INPUTLANGCHANGE</c> message.
/// </para>
/// <para>
/// The language indicator is present on the taskbar only if you have installed more than one keyboard layout and if you have
/// enabled the indicator using the Keyboard control panel application.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-inputlangchangerequest
WM_INPUTLANGCHANGEREQUEST = 0x0050,
/// <summary>
/// <para>
/// Sent to the topmost affected window after an application's input language has been changed. You should make any
/// application-specific settings and pass the message to the <c>DefWindowProc</c> function, which passes the message to all
/// first-level child windows. These child windows can pass the message to <c>DefWindowProc</c> to have it pass the message to
/// their child windows, and so on.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_INPUTLANGCHANGE 0x0051</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Type: **WPARAM**</para>
/// <para>The code page of the new locale.</para>
/// <para><em>lParam</em></para>
/// <para>Type: **LPARAM**</para>
/// <para>The <c>HKL</c> input locale identifier. For more information, see Languages, Locales, and Keyboard Layouts.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return nonzero if it processes this message.</para>
/// <remarks>
/// <para>You can retrieve keyboard locale name via LCIDToLocaleName function. With locale name you can use modern locale functions:</para>
/// <para>
/// <code>case WM_INPUTLANGCHANGE: { HKL hkl = (HKL)lParam; WCHAR localeName[LOCALE_NAME_MAX_LENGTH]; LCIDToLocaleName(MAKELCID(LOWORD(hkl), SORT_DEFAULT), localeName, LOCALE_NAME_MAX_LENGTH, 0); WCHAR lang[9]; GetLocaleInfoEx(localeName, LOCALE_SISO639LANGNAME2, lang, 9); }</code>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-inputlangchange
WM_INPUTLANGCHANGE = 0x0051,
/// <summary>
/// Sent to an application that has initiated a training card with Windows Help. The message informs the application when the
/// user clicks an authorable button. An application initiates a training card by specifying the HELP_TCARD command in a call to
/// the <c>WinHelp</c> function.
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>idAction</em></para>
/// <para>A value that indicates the action the user has taken. This can be one of the following values.</para>
/// <para><em><c>IDABORT</c></em></para>
/// <para>The user clicked an authorable <c>Abort</c> button.</para>
/// <para><em><c>IDCANCEL</c></em></para>
/// <para>The user clicked an authorable <c>Cancel</c> button.</para>
/// <para><em><c>IDCLOSE</c></em></para>
/// <para>The user closed the training card.</para>
/// <para><em><c>IDHELP</c></em></para>
/// <para>The user clicked an authorable Windows <c>Help</c> button.</para>
/// <para><em><c>IDIGNORE</c></em></para>
/// <para>The user clicked an authorable <c>Ignore</c> button.</para>
/// <para><em><c>IDOK</c></em></para>
/// <para>The user clicked an authorable <c>OK</c> button.</para>
/// <para><em><c>IDNO</c></em></para>
/// <para>The user clicked an authorable <c>No</c> button.</para>
/// <para><em><c>IDRETRY</c></em></para>
/// <para>The user clicked an authorable <c>Retry</c> button.</para>
/// <para><em><c>HELP_TCARD_DATA</c></em></para>
/// <para>The user clicked an authorable button. The dwActionData parameter contains a long integer specified by the Help author.</para>
/// <para><em><c>HELP_TCARD_OTHER_CALLER</c></em></para>
/// <para>Another application has requested training cards.</para>
/// <para><em><c>IDYES</c></em></para>
/// <para>The user clicked an authorable <c>Yes</c> button.</para>
/// <para><strong>Returns</strong></para>
/// <para>The return value is ignored; use zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/shell/wm-tcard
WM_TCARD = 0x0052,
/// <summary>
/// Indicates that the user pressed the F1 key. If a menu is active when F1 is pressed, <c>WM_HELP</c> is sent to the window
/// associated with the menu; otherwise, <c>WM_HELP</c> is sent to the window that has the keyboard focus. If no window has the
/// keyboard focus, <c>WM_HELP</c> is sent to the currently active window.
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Must be zero.</para>
/// <para><em>lphi</em></para>
/// <para>
/// The address of a <c>HELPINFO</c> structure that contains information about the menu item, control, dialog box, or window for
/// which Help is requested.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Returns <c>TRUE</c>.</para>
/// <remarks>
/// The <c>DefWindowProc</c> function passes <c>WM_HELP</c> to the parent window of a child window or to the owner of a top-level window.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/shell/wm-help
WM_HELP = 0x0053,
/// <summary>
/// <para>
/// Sent to all windows after the user has logged on or off. When the user logs on or off, the system updates the user-specific
/// settings. The system sends this message immediately after updating the settings.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <para>Note</para>
/// <para>This message is not supported as of Windows Vista.</para>
/// </para>
/// <para>
/// <code>#define WM_USERCHANGED 0x0054</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return zero if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-userchanged
WM_USERCHANGED = 0x0054,
/// <summary>
/// Determines if a window accepts ANSI or Unicode structures in the <c>WM_NOTIFY</c> notification message.
/// <c>WM_NOTIFYFORMAT</c> messages are sent from a common control to its parent window and from the parent window to the common control.
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// A handle to the window that is sending the <c>WM_NOTIFYFORMAT</c> message. If lParam is NF_QUERY, this parameter is the
/// handle to a control. If lParam is NF_REQUERY, this parameter is the handle to the parent window of a control.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The command value that specifies the nature of the <c>WM_NOTIFYFORMAT</c> message. This will be one of the following values:
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>NF_QUERY</c></term>
/// <term>
/// The message is a query to determine whether ANSI or Unicode structures should be used in <c>WM_NOTIFY</c> messages. This
/// command is sent from a control to its parent window during the creation of a control and in response to an NF_REQUERY command.
/// </term>
/// </item>
/// <item>
/// <term><c>NF_REQUERY</c></term>
/// <term>
/// The message is a request for a control to send an NF_QUERY form of this message to its parent window. This command is sent
/// from the parent window. The parent window is asking the control to requery it about the type of structures to use in
/// <c>WM_NOTIFY</c> messages. If <c>lParam</c> is NF_REQUERY, the return value is the result of the requery operation.
/// </term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>Returns one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>NFR_ANSI</c></term>
/// <term>ANSI structures should be used in <c>WM_NOTIFY</c> messages sent by the control.</term>
/// </item>
/// <item>
/// <term><c>NFR_UNICODE</c></term>
/// <term>Unicode structures should be used in <c>WM_NOTIFY</c> messages sent by the control.</term>
/// </item>
/// <item>
/// <term><c>0</c></term>
/// <term>An error occurred.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// When a common control is created, the control sends a <c>WM_NOTIFYFORMAT</c> message to its parent window to determine the
/// type of structures to use in <c>WM_NOTIFY</c> messages. If the parent window does not handle this message, the
/// <c>DefWindowProc</c> function responds according to the type of the parent window. That is, if the parent window is a Unicode
/// window, <c>DefWindowProc</c> returns NFR_UNICODE, and if the parent window is an ANSI window, <c>DefWindowProc</c> returns
/// NFR_ANSI. If the parent window is a dialog box and does not handle this message, the <c>DefDlgProc</c> function similarly
/// responds according to the type of the dialog box (Unicode or ANSI).
/// </para>
/// <para>
/// A parent window can change the type of structures a common control uses in <c>WM_NOTIFY</c> messages by setting lParam to
/// NF_REQUERY and sending a <c>WM_NOTIFYFORMAT</c> message to the control. This causes the control to send an NF_QUERY form of
/// the <c>WM_NOTIFYFORMAT</c> message to the parent window.
/// </para>
/// <para>
/// All common controls will send <c>WM_NOTIFYFORMAT</c> messages. However, the standard Windows controls (edit controls, combo
/// boxes, list boxes, buttons, scroll bars, and static controls) do not.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-notifyformat
WM_NOTIFYFORMAT = 0x0055,
/// <summary>
/// <para>
/// Notifies a window that the user desires a context menu to appear. The user may have clicked the right mouse button
/// (right-clicked) in the window, pressed Shift+F10 or pressed the applications key (context menu key) available on some keyboards.
/// </para>
/// <para>
/// <code>#define WM_CONTEXTMENU 0x007B</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// A handle to the window in which the user right-clicked the mouse. This can be a child window of the window receiving the
/// message. For more information about processing this message, see the Remarks section.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the horizontal position of the cursor, in screen coordinates, at the time of the mouse click.
/// </para>
/// <para>
/// The high-order word specifies the vertical position of the cursor, in screen coordinates, at the time of the mouse click.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>No return value.</para>
/// <remarks>
/// <para>
/// A window can process this message by displaying a shortcut menu using the <c>TrackPopupMenu</c> or <c>TrackPopupMenuEx</c>
/// functions. To obtain the horizontal and vertical positions, use the following code.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// If a window does not display a shortcut menu it should pass this message to the <c>DefWindowProc</c> function. If a window is
/// a child window, <c>DefWindowProc</c> sends the message to the parent. Otherwise, <c>DefWindowProc</c> displays a default
/// shortcut menu if the specified position is in the window's caption.
/// </para>
/// <para>
/// <c>DefWindowProc</c> generates the <c>WM_CONTEXTMENU</c> message when it processes the <c>WM_RBUTTONUP</c> or
/// <c>WM_NCRBUTTONUP</c> message or when the user types SHIFT+F10. The <c>WM_CONTEXTMENU</c> message is also generated when the
/// user presses and releases the <c>VK_APPS</c> key.
/// </para>
/// <para>
/// If the context menu is generated from the keyboard for example, if the user types SHIFT+F10 then the x- and y-coordinates are
/// -1 and the application should display the context menu at the location of the current selection rather than at (xPos, yPos).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-contextmenu
WM_CONTEXTMENU = 0x007B,
/// <summary>
/// <para>Sent to a window when the <c>SetWindowLong</c> function is about to change one or more of the window's styles.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_STYLECHANGING 0x007C</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Indicates whether the window's styles or extended window styles are changing. This parameter can be one or more of the
/// following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>GWL_EXSTYLE</c> -20</term>
/// <term>The extended window styles are changing.</term>
/// </item>
/// <item>
/// <term><c>GWL_STYLE</c> -16</term>
/// <term>The window styles are changing.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>STYLESTRUCT</c> structure that contains the proposed new styles for the window. An application can examine
/// the styles and, if necessary, change them.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return zero if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-stylechanging
WM_STYLECHANGING = 0x007C,
/// <summary>
/// <para>Sent to a window after the <c>SetWindowLong</c> function has changed one or more of the window's styles.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_STYLECHANGED 0x007D</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Indicates whether the window's styles or extended window styles have changed. This parameter can be one or more of the
/// following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>GWL_EXSTYLE</c> -20</term>
/// <term>The extended window styles have changed.</term>
/// </item>
/// <item>
/// <term><c>GWL_STYLE</c> -16</term>
/// <term>The window styles have changed.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>STYLESTRUCT</c> structure that contains the new styles for the window. An application can examine the
/// styles, but cannot change them.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return zero if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-stylechanged
WM_STYLECHANGED = 0x007D,
/// <summary>
/// <para>The <c>WM_DISPLAYCHANGE</c> message is sent to all windows when the display resolution has changed.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The new image depth of the display, in bits per pixel.</para>
/// <para><em>lParam</em></para>
/// <para>The low-order word specifies the horizontal resolution of the screen.</para>
/// <para>The high-order word specifies the vertical resolution of the screen.</para>
/// <remarks>This message is only sent to top-level windows. For all other windows it is posted.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-displaychange
WM_DISPLAYCHANGE = 0x007E,
/// <summary>
/// <para>
/// Sent to a window to retrieve a handle to the large or small icon associated with a window. The system displays the large icon
/// in the ALT+TAB dialog, and the small icon in the window caption.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_GETICON 0x007F</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The type of icon being retrieved. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>ICON_BIG</c> 1</term>
/// <term>Retrieve the large icon for the window.</term>
/// </item>
/// <item>
/// <term><c>ICON_SMALL</c> 0</term>
/// <term>Retrieve the small icon for the window.</term>
/// </item>
/// <item>
/// <term><c>ICON_SMALL2</c> 2</term>
/// <term>
/// Retrieves the small icon provided by the application. If the application does not provide one, the system uses the
/// system-generated icon for that window.
/// </term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>The DPI of the icon being retrieved. This can be used to provide different icons depending on the icon size.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>HICON</c></para>
/// <para>
/// The return value is a handle to the large or small icon, depending on the value of wParam. When an application receives this
/// message, it can return a handle to a large or small icon, or pass the message to the <c>DefWindowProc</c> function.
/// </para>
/// <remarks>
/// <para>
/// When an application receives this message, it can return a handle to a large or small icon, or pass the message to <c>DefWindowProc</c>.
/// </para>
/// <para>
/// <c>DefWindowProc</c> returns a handle to the large or small icon associated with the window, depending on the value of wParam.
/// </para>
/// <para>
/// A window that has no icon explicitly set (with <c>WM_SETICON</c>) uses the icon for the registered window class, and in this
/// case <c>DefWindowProc</c> will return 0 for a <c>WM_GETICON</c> message. If sending a <c>WM_GETICON</c> message to a window
/// returns 0, next try calling the <c>GetClassLongPtr</c> function for the window. If that returns 0 then try the
/// <c>LoadIcon</c> function.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-geticon
WM_GETICON = 0x007F,
/// <summary>
/// <para>
/// Associates a new large or small icon with a window. The system displays the large icon in the ALT+TAB dialog box, and the
/// small icon in the window caption.
/// </para>
/// <para>
/// <code>#define WM_SETICON 0x0080</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The type of icon to be set. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>ICON_BIG</c> 1</term>
/// <term>Set the large icon for the window.</term>
/// </item>
/// <item>
/// <term><c>ICON_SMALL</c> 0</term>
/// <term>Set the small icon for the window.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>A handle to the new large or small icon. If this parameter is <c>NULL</c>, the icon indicated by wParamis removed.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// The return value is a handle to the previous large or small icon, depending on the value of wParam. It is <c>NULL</c> if the
/// window previously had no icon of the type indicated by wParam.
/// </para>
/// <remarks>
/// The <c>DefWindowProc</c> function returns a handle to the previous large or small icon associated with the window, depending
/// on the value of wParam.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-seticon
WM_SETICON = 0x0080,
/// <summary>
/// <para>Sent prior to the <c>WM_CREATE</c> message when a window is first created.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCCREATE 0x0081</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to the <c>CREATESTRUCT</c> structure that contains information about the window being created. The members of
/// <c>CREATESTRUCT</c> are identical to the parameters of the <c>CreateWindowEx</c> function.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c> to continue creation of the window. If the application
/// returns <c>FALSE</c>, the <c>CreateWindow</c> or <c>CreateWindowEx</c> function will return a <c>NULL</c> handle.
/// </para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-nccreate
WM_NCCREATE = 0x0081,
/// <summary>
/// <para>
/// Notifies a window that its nonclient area is being destroyed. The <c>DestroyWindow</c> function sends the <c>WM_NCDESTROY</c>
/// message to the window following the <c>WM_DESTROY</c> message. <c>WM_DESTROY</c> is used to free the allocated memory object
/// associated with the window.
/// </para>
/// <para>
/// The <c>WM_NCDESTROY</c> message is sent after the child windows have been destroyed. In contrast, <c>WM_DESTROY</c> is sent
/// before the child windows are destroyed.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCDESTROY 0x0082</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>This message frees any memory internally allocated for the window.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-ncdestroy
WM_NCDESTROY = 0x0082,
/// <summary>
/// <para>
/// Sent when the size and position of a window's client area must be calculated. By processing this message, an application can
/// control the content of the window's client area when the size or position of the window changes.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCCALCSIZE 0x0083</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// If wParam is <c>TRUE</c>, it specifies that the application should indicate which part of the client area contains valid
/// information. The system copies the valid information to the specified area within the new client area.
/// </para>
/// <para>If wParam is <c>FALSE</c>, the application does not need to indicate the valid part of the client area.</para>
/// <para><em>lParam</em></para>
/// <para>
/// If wParam is <c>TRUE</c>, lParam points to an <c>NCCALCSIZE_PARAMS</c> structure that contains information an application can
/// use to calculate the new size and position of the client rectangle.
/// </para>
/// <para>
/// If wParam is <c>FALSE</c>, lParam points to a <c>RECT</c> structure. On entry, the structure contains the proposed window
/// rectangle for the window. On exit, the structure should contain the screen coordinates of the corresponding window client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If the wParam parameter is <c>FALSE</c>, the application should return zero.</para>
/// <para>If wParam is <c>TRUE</c>, the application should return zero or a combination of the following values.</para>
/// <para>
/// If wParam is <c>TRUE</c> and an application returns zero, the old client area is preserved and is aligned with the upper-left
/// corner of the new client area.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>WVR_ALIGNTOP</c> 0x0010</term>
/// <term>
/// Specifies that the client area of the window is to be preserved and aligned with the top of the new position of the window.
/// For example, to align the client area to the upper-left corner, return the WVR_ALIGNTOP and <c>WVR_ALIGNLEFT</c> values.
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_ALIGNRIGHT</c> 0x0080</term>
/// <term>
/// Specifies that the client area of the window is to be preserved and aligned with the right side of the new position of the
/// window. For example, to align the client area to the lower-right corner, return the <c>WVR_ALIGNRIGHT</c> and WVR_ALIGNBOTTOM values.
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_ALIGNLEFT</c> 0x0020</term>
/// <term>
/// Specifies that the client area of the window is to be preserved and aligned with the left side of the new position of the
/// window. For example, to align the client area to the lower-left corner, return the <c>WVR_ALIGNLEFT</c> and
/// <c>WVR_ALIGNBOTTOM</c> values.
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_ALIGNBOTTOM</c> 0x0040</term>
/// <term>
/// Specifies that the client area of the window is to be preserved and aligned with the bottom of the new position of the
/// window. For example, to align the client area to the top-left corner, return the WVR_ALIGNTOP and <c>WVR_ALIGNLEFT</c> values.
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_HREDRAW</c> 0x0100</term>
/// <term>
/// Used in combination with any other values, except <c>WVR_VALIDRECTS</c>, causes the window to be completely redrawn if the
/// client rectangle changes size horizontally. This value is similar to CS_HREDRAW class style
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_VREDRAW</c> 0x0200</term>
/// <term>
/// Used in combination with any other values, except <c>WVR_VALIDRECTS</c>, causes the window to be completely redrawn if the
/// client rectangle changes size vertically. This value is similar to CS_VREDRAW class style
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_REDRAW</c> 0x0300</term>
/// <term>
/// This value causes the entire window to be redrawn. It is a combination of <c>WVR_HREDRAW</c> and <c>WVR_VREDRAW</c> values.
/// </term>
/// </item>
/// <item>
/// <term><c>WVR_VALIDRECTS</c> 0x0400</term>
/// <term>
/// This value indicates that, upon return from <c>WM_NCCALCSIZE</c>, the rectangles specified by the <c>rgrc</c>[1] and
/// <c>rgrc</c>[2] members of the <c>NCCALCSIZE_PARAMS</c> structure contain valid destination and source area rectangles,
/// respectively. The system combines these rectangles to calculate the area of the window to be preserved. The system copies any
/// part of the window image that is within the source rectangle and clips the image to the destination rectangle. Both
/// rectangles are in parent-relative or screen-relative coordinates. This flag cannot be combined with any other flags. This
/// return value allows an application to implement more elaborate client-area preservation strategies, such as centering or
/// preserving a subset of the client area.
/// </term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// The window may be redrawn, depending on whether the CS_HREDRAW or CS_VREDRAW class style is specified. This is the default,
/// backward-compatible processing of this message by the <c>DefWindowProc</c> function (in addition to the usual client
/// rectangle calculation described in the preceding table).
/// </para>
/// <para>
/// When wParam is <c>TRUE</c>, simply returning 0 without processing the <c>NCCALCSIZE_PARAMS</c> rectangles will cause the
/// client area to resize to the size of the window, including the window frame. This will remove the window frame and caption
/// items from your window, leaving only the client area displayed.
/// </para>
/// <para>
/// Starting with Windows Vista, removing the standard frame by simply returning 0 when the wParam is <c>TRUE</c> does not affect
/// frames that are extended into the client area using the <c>DwmExtendFrameIntoClientArea</c> function. Only the standard frame
/// will be removed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-nccalcsize
WM_NCCALCSIZE = 0x0083,
/// <summary>
/// <para>
/// Sent to a window in order to determine what part of the window corresponds to a particular screen coordinate. This can
/// happen, for example, when the cursor moves, when a mouse button is pressed or released, or in response to a call to a
/// function such as <c>WindowFromPoint</c>. If the mouse is not captured, the message is sent to the window beneath the cursor.
/// Otherwise, the message is sent to the window that has captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCHITTEST 0x0084</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the screen.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value of the <c>DefWindowProc</c> function is one of the following values, indicating the position of the cursor
/// hot spot.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>HTBORDER</c> 18</term>
/// <term>In the border of a window that does not have a sizing border.</term>
/// </item>
/// <item>
/// <term><c>HTBOTTOM</c> 15</term>
/// <term>In the lower-horizontal border of a resizable window (the user can click the mouse to resize the window vertically).</term>
/// </item>
/// <item>
/// <term><c>HTBOTTOMLEFT</c> 16</term>
/// <term>In the lower-left corner of a border of a resizable window (the user can click the mouse to resize the window diagonally).</term>
/// </item>
/// <item>
/// <term><c>HTBOTTOMRIGHT</c> 17</term>
/// <term>In the lower-right corner of a border of a resizable window (the user can click the mouse to resize the window diagonally).</term>
/// </item>
/// <item>
/// <term><c>HTCAPTION</c> 2</term>
/// <term>In a title bar.</term>
/// </item>
/// <item>
/// <term><c>HTCLIENT</c> 1</term>
/// <term>In a client area.</term>
/// </item>
/// <item>
/// <term><c>HTCLOSE</c> 20</term>
/// <term>In a <c>Close</c> button.</term>
/// </item>
/// <item>
/// <term><c>HTERROR</c> -2</term>
/// <term>
/// On the screen background or on a dividing line between windows (same as <c>HTNOWHERE</c>, except that the
/// <c>DefWindowProc</c> function produces a system beep to indicate an error).
/// </term>
/// </item>
/// <item>
/// <term><c>HTGROWBOX</c> 4</term>
/// <term>In a size box (same as <c>HTSIZE</c>).</term>
/// </item>
/// <item>
/// <term><c>HTHELP</c> 21</term>
/// <term>In a <c>Help</c> button.</term>
/// </item>
/// <item>
/// <term><c>HTHSCROLL</c> 6</term>
/// <term>In a horizontal scroll bar.</term>
/// </item>
/// <item>
/// <term><c>HTLEFT</c> 10</term>
/// <term>In the left border of a resizable window (the user can click the mouse to resize the window horizontally).</term>
/// </item>
/// <item>
/// <term><c>HTMENU</c> 5</term>
/// <term>In a menu.</term>
/// </item>
/// <item>
/// <term><c>HTMAXBUTTON</c> 9</term>
/// <term>In a <c>Maximize</c> button.</term>
/// </item>
/// <item>
/// <term><c>HTMINBUTTON</c> 8</term>
/// <term>In a <c>Minimize</c> button.</term>
/// </item>
/// <item>
/// <term><c>HTNOWHERE</c> 0</term>
/// <term>On the screen background or on a dividing line between windows.</term>
/// </item>
/// <item>
/// <term><c>HTREDUCE</c> 8</term>
/// <term>In a <c>Minimize</c> button.</term>
/// </item>
/// <item>
/// <term><c>HTRIGHT</c> 11</term>
/// <term>In the right border of a resizable window (the user can click the mouse to resize the window horizontally).</term>
/// </item>
/// <item>
/// <term><c>HTSIZE</c> 4</term>
/// <term>In a size box (same as <c>HTGROWBOX</c>).</term>
/// </item>
/// <item>
/// <term><c>HTSYSMENU</c> 3</term>
/// <term>In a window menu or in a <c>Close</c> button in a child window.</term>
/// </item>
/// <item>
/// <term><c>HTTOP</c> 12</term>
/// <term>In the upper-horizontal border of a window.</term>
/// </item>
/// <item>
/// <term><c>HTTOPLEFT</c> 13</term>
/// <term>In the upper-left corner of a window border.</term>
/// </item>
/// <item>
/// <term><c>HTTOPRIGHT</c> 14</term>
/// <term>In the upper-right corner of a window border.</term>
/// </item>
/// <item>
/// <term><c>HTTRANSPARENT</c> -1</term>
/// <term>
/// In a window currently covered by another window in the same thread (the message will be sent to underlying windows in the
/// same thread until one of them returns a code that is not <c>HTTRANSPARENT</c>).
/// </term>
/// </item>
/// <item>
/// <term><c>HTVSCROLL</c> 7</term>
/// <term>In the vertical scroll bar.</term>
/// </item>
/// <item>
/// <term><c>HTZOOM</c> 9</term>
/// <term>In a <c>Maximize</c> button.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// <c>Windows Vista:</c> When creating custom frames that include the standard caption buttons, this message should first be
/// passed to the <c>DwmDefWindowProc</c> function. This enables the Desktop Window Manager (DWM) to provide hit-testing for the
/// captions buttons. If <c>DwmDefWindowProc</c> does not handle the message, further processing of <c>WM_NCHITTEST</c> may be needed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nchittest
WM_NCHITTEST = 0x0084,
/// <summary>
/// <para>The <c>WM_NCPAINT</c> message is sent to a window when its frame must be painted.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the update region of the window. The update region is clipped to the window frame.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application returns zero if it processes this message.</para>
/// <remarks>
/// <para>The <c>DefWindowProc</c> function paints the window frame.</para>
/// <para>
/// An application can intercept the <c>WM_NCPAINT</c> message and paint its own custom window frame. The clipping region for a
/// window is always rectangular, even if the shape of the frame is altered.
/// </para>
/// <para>The wParam value can be passed to <c>GetDCEx</c> as in the following example.</para>
/// <para>
/// <code>case WM_NCPAINT: { HDC hdc; hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN); // Paint into this DC ReleaseDC(hwnd, hdc); }</code>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-ncpaint
WM_NCPAINT = 0x0085,
/// <summary>
/// <para>Sent to a window when its nonclient area needs to be changed to indicate an active or inactive state.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCACTIVATE 0x0086</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Indicates when a title bar or icon needs to be changed to indicate an active or inactive state. If an active title bar or
/// icon is to be drawn, the wParam parameter is <c>TRUE</c>. If an inactive title bar or icon is to be drawn, wParam is <c>FALSE</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>When a visual style is active for this window, this parameter is not used.</para>
/// <para>
/// When a visual style is not active for this window, this parameter is a handle to an optional update region for the nonclient
/// area of the window. If this parameter is set to -1, <c>DefWindowProc</c> does not repaint the nonclient area to reflect the
/// state change.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>
/// When the wParam parameter is <c>FALSE</c>, an application should return <c>TRUE</c> to indicate that the system should
/// proceed with the default processing, or it should return <c>FALSE</c> to prevent the change. When wParam is <c>TRUE</c>, the
/// return value is ignored.
/// </para>
/// <remarks>
/// <para>
/// Processing messages related to the nonclient area of a standard window is not recommended, because the application must be
/// able to draw all the required parts of the nonclient area for the window. If an application does process this message, it
/// must return <c>TRUE</c> to direct the system to complete the change of active window. If the window is minimized when this
/// message is received, the application should pass the message to the <c>DefWindowProc</c> function.
/// </para>
/// <para>
/// The <c>DefWindowProc</c> function draws the title bar or icon title in its active colors when the wParam parameter is
/// <c>TRUE</c> and in its inactive colors when wParam is <c>FALSE</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-ncactivate
WM_NCACTIVATE = 0x0086,
/// <summary>
/// <para>
/// Sent to the window procedure associated with a control. By default, the system handles all keyboard input to the control; the
/// system interprets certain types of keyboard input as dialog box navigation keys. To override this default behavior, the
/// control can respond to the <c>WM_GETDLGCODE</c> message to indicate the types of input it wants to process itself.
/// </para>
/// <para>
/// <code>#define WM_GETDLGCODE 0x0087</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The virtual key, pressed by the user, that prompted Windows to issue this notification. The handler must selectively handle
/// these keys. For instance, the handler might accept and process <c>VK_RETURN</c> but delegate <c>VK_TAB</c> to the owner
/// window. For a list of values, see <c>Virtual-Key Codes</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>A pointer to an <c>MSG</c> structure (or <c>NULL</c> if the system is performing a query).</para>
/// <para><strong>Returns</strong></para>
/// <para>The return value is one or more of the following values, indicating which type of input the application processes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>DLGC_BUTTON</c> 0x2000</term>
/// <term>Button.</term>
/// </item>
/// <item>
/// <term><c>DLGC_DEFPUSHBUTTON</c> 0x0010</term>
/// <term>Default push button.</term>
/// </item>
/// <item>
/// <term><c>DLGC_HASSETSEL</c> 0x0008</term>
/// <term><c>EM_SETSEL</c> messages.</term>
/// </item>
/// <item>
/// <term><c>DLGC_RADIOBUTTON</c> 0x0040</term>
/// <term>Radio button.</term>
/// </item>
/// <item>
/// <term><c>DLGC_STATIC</c> 0x0100</term>
/// <term>Static control.</term>
/// </item>
/// <item>
/// <term><c>DLGC_UNDEFPUSHBUTTON</c> 0x0020</term>
/// <term>Non-default push button.</term>
/// </item>
/// <item>
/// <term><c>DLGC_WANTALLKEYS</c> 0x0004</term>
/// <term>All keyboard input.</term>
/// </item>
/// <item>
/// <term><c>DLGC_WANTARROWS</c> 0x0001</term>
/// <term>Direction keys.</term>
/// </item>
/// <item>
/// <term><c>DLGC_WANTCHARS</c> 0x0080</term>
/// <term><c>WM_CHAR</c> messages.</term>
/// </item>
/// <item>
/// <term><c>DLGC_WANTMESSAGE</c> 0x0004</term>
/// <term>All keyboard input (the application passes this message in the <c>MSG</c> structure to the control).</term>
/// </item>
/// <item>
/// <term><c>DLGC_WANTTAB</c> 0x0002</term>
/// <term>TAB key.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// Although the <c>DefWindowProc</c> function always returns zero in response to the <c>WM_GETDLGCODE</c> message, the window
/// procedure for the predefined control classes return a code appropriate for each class.
/// </para>
/// <para>
/// The <c>WM_GETDLGCODE</c> message and the returned values are useful only with user-defined dialog box controls or standard
/// controls modified by subclassing.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dlgbox/wm-getdlgcode
WM_GETDLGCODE = 0x0087,
/// <summary>
/// <para>The <c>WM_SYNCPAINT</c> message is used to synchronize painting while avoiding linking independent GUI threads.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application returns zero if it processes this message.</para>
/// <remarks>
/// When a window has been hidden, shown, moved, or sized, the system may determine that it is necessary to send a
/// <c>WM_SYNCPAINT</c> message to the top-level windows of other threads. Applications must pass <c>WM_SYNCPAINT</c> to
/// <c>DefWindowProc</c> for processing. The <c>DefWindowProc</c> function will send a <c>WM_NCPAINT</c> message to the window
/// procedure if the window frame must be painted and send a <c>WM_ERASEBKGND</c> message if the window background must be erased.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-syncpaint
WM_SYNCPAINT = 0x0088,
/// <summary/>
WM_UAHDESTROYWINDOW = 0x0090,
/// <summary/>
WM_UAHDRAWMENU = 0x0091,
/// <summary/>
WM_UAHDRAWMENUITEM = 0x0092,
/// <summary/>
WM_UAHINITMENU = 0x0093,
/// <summary/>
WM_UAHMEASUREMENUITEM = 0x0094,
/// <summary/>
WM_UAHNCPAINTMENUPOPUP = 0x0095,
/// <summary>
/// <para>
/// Posted to a window when the cursor is moved within the nonclient area of the window. This message is posted to the window
/// that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCMOUSEMOVE 0x00A0</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncmousemove
WM_NCMOUSEMOVE = 0x00A0,
/// <summary>
/// <para>
/// Posted when the user presses the left mouse button while the cursor is within the nonclient area of a window. This message is
/// posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCLBUTTONDOWN 0x00A1</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function tests the specified point to find the location of the cursor and performs the appropriate
/// action. If appropriate, <c>DefWindowProc</c> sends the <c>WM_SYSCOMMAND</c> message to the window.
/// </para>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nclbuttondown
WM_NCLBUTTONDOWN = 0x00A1,
/// <summary>
/// <para>
/// Posted when the user releases the left mouse button while the cursor is within the nonclient area of a window. This message
/// is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCLBUTTONUP 0x00A2</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function tests the specified point to find out the location of the cursor and performs the
/// appropriate action. If appropriate, <c>DefWindowProc</c> sends the <c>WM_SYSCOMMAND</c> message to the window.
/// </para>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nclbuttonup
WM_NCLBUTTONUP = 0x00A2,
/// <summary>
/// <para>
/// Posted when the user double-clicks the left mouse button while the cursor is within the nonclient area of a window. This
/// message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCLBUTTONDBLCLK 0x00A3</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// By default, the <c>DefWindowProc</c> function tests the specified point to find out the location of the cursor and performs
/// the appropriate action. If appropriate, <c>DefWindowProc</c> sends the <c>WM_SYSCOMMAND</c> message to the window.
/// </para>
/// <para>A window need not have the <c>CS_DBLCLKS</c> style to receive <c>WM_NCLBUTTONDBLCLK</c> messages.</para>
/// <para>
/// The system generates a <c>WM_NCLBUTTONDBLCLK</c> message when the user presses, releases, and again presses the left mouse
/// button within the system's double-click time limit. Double-clicking the left mouse button actually generates four messages:
/// <c>WM_NCLBUTTONDOWN</c>, <c>WM_NCLBUTTONUP</c>, <c>WM_NCLBUTTONDBLCLK</c>, and <c>WM_NCLBUTTONUP</c> again.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nclbuttondblclk
WM_NCLBUTTONDBLCLK = 0x00A3,
/// <summary>
/// <para>
/// Posted when the user presses the right mouse button while the cursor is within the nonclient area of a window. This message
/// is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCRBUTTONDOWN 0x00A4</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncrbuttondown
WM_NCRBUTTONDOWN = 0x00A4,
/// <summary>
/// <para>
/// Posted when the user releases the right mouse button while the cursor is within the nonclient area of a window. This message
/// is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCRBUTTONUP 0x00A5</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncrbuttonup
WM_NCRBUTTONUP = 0x00A5,
/// <summary>
/// <para>
/// Posted when the user double-clicks the right mouse button while the cursor is within the nonclient area of a window. This
/// message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCRBUTTONDBLCLK 0x00A6</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>A window need not have the <c>CS_DBLCLKS</c> style to receive <c>WM_NCRBUTTONDBLCLK</c> messages.</para>
/// <para>
/// The system generates a <c>WM_NCRBUTTONDBLCLK</c> message when the user presses, releases, and again presses the right mouse
/// button within the system's double-click time limit. Double-clicking the right mouse button actually generates four messages:
/// <c>WM_NCRBUTTONDOWN</c>, <c>WM_NCRBUTTONUP</c>, <c>WM_NCRBUTTONDBLCLK</c>, and <c>WM_NCRBUTTONUP</c> again.
/// </para>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncrbuttondblclk
WM_NCRBUTTONDBLCLK = 0x00A6,
/// <summary>
/// <para>
/// Posted when the user presses the middle mouse button while the cursor is within the nonclient area of a window. This message
/// is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCMBUTTONDOWN 0x00A7</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncmbuttondown
WM_NCMBUTTONDOWN = 0x00A7,
/// <summary>
/// <para>
/// Posted when the user releases the middle mouse button while the cursor is within the nonclient area of a window. This message
/// is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCMBUTTONUP 0x00A8</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncmbuttonup
WM_NCMBUTTONUP = 0x00A8,
/// <summary>
/// <para>
/// Posted when the user double-clicks the middle mouse button while the cursor is within the nonclient area of a window. This
/// message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCMBUTTONDBLCLK 0x00A9</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>A window need not have the <c>CS_DBLCLKS</c> style to receive <c>WM_NCMBUTTONDBLCLK</c> messages.</para>
/// <para>
/// The system generates a <c>WM_NCMBUTTONDBLCLK</c> message when the user presses, releases, and again presses the middle mouse
/// button within the system's double-click time limit. Double-clicking the middle mouse button actually generates four messages:
/// <c>WM_NCMBUTTONDOWN</c>, <c>WM_NCMBUTTONUP</c>, <c>WM_NCMBUTTONDBLCLK</c>, and <c>WM_NCMBUTTONUP</c> again.
/// </para>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>If it is appropriate to do so, the system sends the <c>WM_SYSCOMMAND</c> message to the window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncmbuttondblclk
WM_NCMBUTTONDBLCLK = 0x00A9,
/// <summary>
/// <para>
/// Posted when the user presses the first or second X button while the cursor is in the nonclient area of a window. This message
/// is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCXBUTTONDOWN 0x00AB</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The low-order word specifies the hit-test value returned by the <c>DefWindowProc</c> function from processing the
/// <c>WM_NCHITTEST</c> message. For a list of hit-test values, see <c>WM_NCHITTEST</c>. The high-order word indicates which
/// button was pressed. It can be one of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>XBUTTON1</c> 0x0001</term>
/// <term>The first X button was pressed.</term>
/// </item>
/// <item>
/// <term><c>XBUTTON2</c> 0x0002</term>
/// <term>The second X button was pressed.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to
/// the upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter.</para>
/// <para>
/// <code>nHittest = GET_NCHITTEST_WPARAM(wParam); fwButton = GET_XBUTTON_WPARAM(wParam);</code>
/// </para>
/// <para>You can also use the following code to get the x- and y-coordinates from lParam:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// By default, the <c>DefWindowProc</c> function tests the specified point to get the position of the cursor and performs the
/// appropriate action. If appropriate, it sends the <c>WM_SYSCOMMAND</c> message to the window.
/// </para>
/// <para>
/// Unlike the <c>WM_NCLBUTTONDOWN</c>, <c>WM_NCMBUTTONDOWN</c>, and <c>WM_NCRBUTTONDOWN</c> messages, an application should
/// return <c>TRUE</c> from this message if it processes it. Doing so will allow software that simulates this message on Windows
/// systems earlier than Windows 2000 to determine whether the window procedure processed the message or called
/// <c>DefWindowProc</c> to process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncxbuttondown
WM_NCXBUTTONDOWN = 0x00AB,
/// <summary>
/// <para>
/// Posted when the user releases the first or second X button while the cursor is in the nonclient area of a window. This
/// message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCXBUTTONUP 0x00AC</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The low-order word specifies the hit-test value returned by the <c>DefWindowProc</c> function from processing the
/// <c>WM_NCHITTEST</c> message. For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para>The high-order word indicates which button was released. It can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>XBUTTON1</c> 0x0001</term>
/// <term>The first X button was released.</term>
/// </item>
/// <item>
/// <term><c>XBUTTON2</c> 0x0002</term>
/// <term>The second X button was released.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to
/// the upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter.</para>
/// <para>
/// <code>nHittest = GET_NCHITTEST_WPARAM(wParam); fwButton = GET_XBUTTON_WPARAM(wParam);</code>
/// </para>
/// <para>You can also use the following code to get the x- and y-coordinates from lParam:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// By default, the <c>DefWindowProc</c> function tests the specified point to get the position of the cursor and performs the
/// appropriate action. If appropriate, it sends the <c>WM_SYSCOMMAND</c> message to the window.
/// </para>
/// <para>
/// Unlike the <c>WM_NCLBUTTONUP</c>, <c>WM_NCMBUTTONUP</c>, and <c>WM_NCRBUTTONUP</c> messages, an application should return
/// <c>TRUE</c> from this message if it processes it. Doing so will allow software that simulates this message on Windows systems
/// earlier than Windows 2000 to determine whether the window procedure processed the message or called <c>DefWindowProc</c> to
/// process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncxbuttonup
WM_NCXBUTTONUP = 0x00AC,
/// <summary>
/// <para>
/// Posted when the user double-clicks the first or second X button while the cursor is in the nonclient area of a window. This
/// message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCXBUTTONDBLCLK 0x00AD</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The low-order word specifies the hit-test value returned by the <c>DefWindowProc</c> function from processing the
/// <c>WM_NCHITTEST</c> message. For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para>The high-order word indicates which button was double-clicked. It can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>XBUTTON1</c> 0x0001</term>
/// <term>The first X button was double-clicked..</term>
/// </item>
/// <item>
/// <term><c>XBUTTON2</c> 0x0002</term>
/// <term>The second X button was double-clicked.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to
/// the upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter.</para>
/// <para>
/// <code>nHittest = GET_NCHITTEST_WPARAM(wParam); fwButton = GET_XBUTTON_WPARAM(wParam);</code>
/// </para>
/// <para>You can also use the following code to get the x- and y-coordinates from lParam:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// By default, the <c>DefWindowProc</c> function tests the specified point to get the position of the cursor and performs the
/// appropriate action. If appropriate, it sends the <c>WM_SYSCOMMAND</c> message to the window.
/// </para>
/// <para>
/// A window need not have the <c>CS_DBLCLKS</c> style to receive <c>WM_NCXBUTTONDBLCLK</c> messages. The system generates a
/// <c>WM_NCXBUTTONDBLCLK</c> message when the user presses, releases, and again presses an X button within the system's
/// double-click time limit. Double-clicking one of these buttons actually generates four messages: <c>WM_NCXBUTTONDOWN</c>,
/// <c>WM_NCXBUTTONUP</c>, <c>WM_NCXBUTTONDBLCLK</c>, and <c>WM_NCXBUTTONUP</c> again.
/// </para>
/// <para>
/// Unlike the <c>WM_NCLBUTTONDBLCLK</c>, <c>WM_NCMBUTTONDBLCLK</c>, and <c>WM_NCRBUTTONDBLCLK</c> messages, an application
/// should return <c>TRUE</c> from this message if it processes it. Doing so will allow software that simulates this message on
/// Windows systems earlier than Windows 2000 to determine whether the window procedure processed the message or called
/// <c>DefWindowProc</c> to process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncxbuttondblclk
WM_NCXBUTTONDBLCLK = 0x00AD,
/// <summary>
/// Simulates the user clicking a button. This message causes the button to receive the <c>WM_LBUTTONDOWN</c> and
/// <c>WM_LBUTTONUP</c> messages, and the button's parent window to receive a BN_CLICKED notification code.
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>This message does not return a value.</para>
/// <remarks>
/// If the button is in a dialog box and the dialog box is not active, the <c>BM_CLICK</c> message might fail. To ensure success
/// in this situation, call the <c>SetActiveWindow</c> function to activate the dialog box before sending the <c>BM_CLICK</c>
/// message to the button.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/bm-click
WM_BM_CLICK = 0x00F5,
/// <summary>
/// <para>Sent to the window that registered to receive raw input.</para>
/// <para>
/// Raw input notifications are available only after the application calls RegisterRawInputDevices with RIDEV_DEVNOTIFY flag.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_INPUT_DEVICE_CHANGE 0x00FE</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Type: <c>WPARAM</c></para>
/// <para>This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>GIDC_ARRIVAL</c> 1</term>
/// <term>
/// A new device has been added to the system. You can call GetRawInputDeviceInfo to get more information regarding the device.
/// </term>
/// </item>
/// <item>
/// <term><c>GIDC_REMOVAL</c> 2</term>
/// <term>A device has been removed from the system.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>Type: <c>LPARAM</c></para>
/// <para>The <c>HANDLE</c> to the raw input device.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-input-device-change
WM_INPUT_DEVICE_CHANGE = 0x00FE,
/// <summary>
/// <para>Sent to the window that is getting raw input.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_INPUT 0x00FF</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The input code. Use <c>GET_RAWINPUT_CODE_WPARAM</c> macro to get the value.</para>
/// <para>Can be one of the following values:</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>RIM_INPUT</c> 0</term>
/// <term>
/// Input occurred while the application was in the foreground. The application must call <c>DefWindowProc</c> so the system can
/// perform cleanup.
/// </term>
/// </item>
/// <item>
/// <term><c>RIM_INPUTSINK</c> 1</term>
/// <term>Input occurred while the application was not in the foreground.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>HRAWINPUT</c> handle to the <c>RAWINPUT</c> structure that contains the raw input from the device. To get the raw data,
/// use this handle in the call to <c>GetRawInputData</c>.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>Raw input is available only when the application calls <c>RegisterRawInputDevices</c> with valid device specifications.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-input
WM_INPUT = 0x00FF,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when
/// the ALT key is not pressed.
/// </para>
/// <para>
/// <code>#define WM_KEYDOWN 0x0100</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The virtual-key code of the nonsystem key. See Virtual-Key Codes.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown following.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is always 0 for a <c>WM_KEYDOWN</c> message.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is always 0 for a <c>WM_KEYDOWN</c> message.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// If the F10 key is pressed, the <c>DefWindowProc</c> function sets an internal flag. When <c>DefWindowProc</c> receives the
/// <c>WM_KEYUP</c> message, the function checks whether the internal flag is set and, if so, sends a <c>WM_SYSCOMMAND</c>
/// message to the top-level window. The <c>WM_SYSCOMMAND</c> parameter of the message is set to SC_KEYMENU.
/// </para>
/// <para>
/// Because of the autorepeat feature, more than one <c>WM_KEYDOWN</c> message may be posted before a <c>WM_KEYUP</c> message is
/// posted. The previous key state (bit 30) can be used to determine whether the <c>WM_KEYDOWN</c> message indicates the first
/// down transition or a repeated down transition.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the divide
/// (/) and ENTER keys in the numeric keypad. Other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// <para>Applications must pass wParam to <c>TranslateMessage</c> without altering it at all.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown
WM_KEYFIRST = 0x0100,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when
/// the ALT key is not pressed.
/// </para>
/// <para>
/// <code>#define WM_KEYDOWN 0x0100</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The virtual-key code of the nonsystem key. See Virtual-Key Codes.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown following.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is always 0 for a <c>WM_KEYDOWN</c> message.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is always 0 for a <c>WM_KEYDOWN</c> message.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// If the F10 key is pressed, the <c>DefWindowProc</c> function sets an internal flag. When <c>DefWindowProc</c> receives the
/// <c>WM_KEYUP</c> message, the function checks whether the internal flag is set and, if so, sends a <c>WM_SYSCOMMAND</c>
/// message to the top-level window. The <c>WM_SYSCOMMAND</c> parameter of the message is set to SC_KEYMENU.
/// </para>
/// <para>
/// Because of the autorepeat feature, more than one <c>WM_KEYDOWN</c> message may be posted before a <c>WM_KEYUP</c> message is
/// posted. The previous key state (bit 30) can be used to determine whether the <c>WM_KEYDOWN</c> message indicates the first
/// down transition or a repeated down transition.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the divide
/// (/) and ENTER keys in the numeric keypad. Other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// <para>Applications must pass wParam to <c>TranslateMessage</c> without altering it at all.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown
WM_KEYDOWN = 0x0100,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when a nonsystem key is released. A nonsystem key is a key that is pressed when
/// the ALT key is not pressed, or a keyboard key that is pressed when a window has the keyboard focus.
/// </para>
/// <para>
/// <code>#define WM_KEYUP 0x0101</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The virtual-key code of the nonsystem key. See Virtual-Key Codes.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. The repeat count is always 1 for a <c>WM_KEYUP</c> message.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is always 0 for a <c>WM_KEYUP</c> message.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is always 1 for a <c>WM_KEYUP</c> message.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is always 1 for a <c>WM_KEYUP</c> message.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function sends a <c>WM_SYSCOMMAND</c> message to the top-level window if the F10 key or the ALT key
/// was released. The wParam parameter of the message is set to SC_KEYMENU.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the divide
/// (/) and ENTER keys in the numeric keypad. Other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// <para>Applications must pass wParam to <c>TranslateMessage</c> without altering it at all.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-keyup
WM_KEYUP = 0x0101,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when a <c>WM_KEYDOWN</c> message is translated by the <c>TranslateMessage</c>
/// function. The <c>WM_CHAR</c> message contains the character code of the key that was pressed.
/// </para>
/// <para>
/// <code>#define WM_CHAR 0x0102</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The character code of the key.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>The <c>WM_CHAR</c> message uses Unicode Transformation Format (UTF)-16.</para>
/// <para>
/// There is not necessarily a one-to-one correspondence between keys pressed and character messages generated, and so the
/// information in the high-order word of the lParam parameter is generally not useful to applications. The information in the
/// high-order word applies only to the most recent <c>WM_KEYDOWN</c> message that precedes the posting of the <c>WM_CHAR</c> message.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and the right CTRL keys on the main section of the
/// keyboard; the INS, DEL, HOME, END, PAGE UP, PAGE DOWN and arrow keys in the clusters to the left of the numeric keypad; and
/// the divide (/) and ENTER keys in the numeric keypad. Some other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// <para>
/// The <c>WM_UNICHAR</c> message is the same as <c>WM_CHAR</c>, except it uses UTF-32. It is designed to send or post Unicode
/// characters to ANSI windows, and it can handle Unicode Supplementary Plane characters.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-char
WM_CHAR = 0x0102,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when a <c>WM_KEYUP</c> message is translated by the <c>TranslateMessage</c>
/// function. <c>WM_DEADCHAR</c> specifies a character code generated by a dead key. A dead key is a key that generates a
/// character, such as the umlaut (double-dot), that is combined with another character to form a composite character. For
/// example, the umlaut-O character ( ) is generated by typing the dead key for the umlaut character, and then typing the O key.
/// </para>
/// <para>
/// <code>#define WM_DEADCHAR 0x0103</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The character code generated by the dead key.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// The <c>WM_DEADCHAR</c> message typically is used by applications to give the user feedback about each key pressed. For
/// example, an application can display the accent in the current character position without moving the caret.
/// </para>
/// <para>
/// Because there is not necessarily a one-to-one correspondence between keys pressed and character messages generated, the
/// information in the high-order word of the lParam parameter is generally not useful to applications. The information in the
/// high-order word applies only to the most recent <c>WM_KEYDOWN</c> message that precedes the posting of the <c>WM_DEADCHAR</c> message.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and the right CTRL keys on the main section of the
/// keyboard; the INS, DEL, HOME, END, PAGE UP, PAGE DOWN and arrow keys in the clusters to the left of the numeric keypad; and
/// the divide (/) and ENTER keys in the numeric keypad. Some other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-deadchar
WM_DEADCHAR = 0x0103,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when the user presses the F10 key (which activates the menu bar) or holds down
/// the ALT key and then presses another key. It also occurs when no window currently has the keyboard focus; in this case, the
/// <c>WM_SYSKEYDOWN</c> message is sent to the active window. The window that receives the message can distinguish between these
/// two contexts by checking the context code in the lParam parameter.
/// </para>
/// <para>
/// <code>#define WM_SYSKEYDOWN 0x0104</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The virtual-key code of the key being pressed. See <c>Virtual-Key Codes</c>.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>
/// The context code. The value is 1 if the ALT key is down while the key is pressed; it is 0 if the <c>WM_SYSKEYDOWN</c> message
/// is posted to the active window because no window has the keyboard focus.
/// </term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is always 0 for a <c>WM_SYSKEYDOWN</c> message.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function examines the specified key and generates a <c>WM_SYSCOMMAND</c> message if the key is
/// either TAB or ENTER.
/// </para>
/// <para>
/// When the context code is zero, the message can be passed to the <c>TranslateAccelerator</c> function, which will handle it as
/// though it were a normal key message instead of a character-key message. This allows accelerator keys to be used with the
/// active window even if the active window does not have the keyboard focus.
/// </para>
/// <para>
/// Because of automatic repeat, more than one <c>WM_SYSKEYDOWN</c> message may occur before a <c>WM_SYSKEYUP</c> message is
/// sent. The previous key state (bit 30) can be used to determine whether the <c>WM_SYSKEYDOWN</c> message indicates the first
/// down transition or a repeated down transition.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, enhanced keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the divide
/// (/) and ENTER keys in the numeric keypad. Other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// <para>This message is also sent whenever the user presses the F10 key without the ALT key.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-syskeydown
WM_SYSKEYDOWN = 0x0104,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when the user releases a key that was pressed while the ALT key was held down.
/// It also occurs when no window currently has the keyboard focus; in this case, the <c>WM_SYSKEYUP</c> message is sent to the
/// active window. The window that receives the message can distinguish between these two contexts by checking the context code
/// in the lParam parameter.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_SYSKEYUP 0x0105</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The virtual-key code of the key being released. See <c>Virtual-Key Codes</c>.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. The repeat count is always one for a <c>WM_SYSKEYUP</c> message.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is zero.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>
/// The context code. The value is 1 if the ALT key is down while the key is released; it is zero if the <c>WM_SYSKEYUP</c>
/// message is posted to the active window because no window has the keyboard focus.
/// </term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is always 1 for a <c>WM_SYSKEYUP</c> message.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is always 1 for a <c>WM_SYSKEYUP</c> message.</term>
/// </item>
/// </list>
/// <para>For more details, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// The <c>DefWindowProc</c> function sends a <c>WM_SYSCOMMAND</c> message to the top-level window if the F10 key or the ALT key
/// was released. The wParam parameter of the message is set to <c>SC_KEYMENU</c>.
/// </para>
/// <para>
/// When the context code is zero, the message can be passed to the <c>TranslateAccelerator</c> function, which will handle it as
/// though it were a normal key message instead of a character-key message. This allows accelerator keys to be used with the
/// active window even if the active window does not have the keyboard focus.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the divide
/// (/) and ENTER keys in the numeric keypad. Other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// <para>
/// For non-U.S. enhanced 102-key keyboards, the right ALT key is handled as a CTRL+ALT key. The following table shows the
/// sequence of messages that result when the user presses and releases this key.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Message</term>
/// <term>Virtual-key code</term>
/// </listheader>
/// <item>
/// <term><c>WM_KEYDOWN</c></term>
/// <term><c>VK_CONTROL</c></term>
/// </item>
/// <item>
/// <term><c>WM_KEYDOWN</c></term>
/// <term><c>VK_MENU</c></term>
/// </item>
/// <item>
/// <term><c>WM_KEYUP</c></term>
/// <term><c>VK_CONTROL</c></term>
/// </item>
/// <item>
/// <term><c>WM_SYSKEYUP</c></term>
/// <term><c>VK_MENU</c></term>
/// </item>
/// </list>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-syskeyup
WM_SYSKEYUP = 0x0105,
/// <summary>
/// <para>
/// Posted to the window with the keyboard focus when a <c>WM_SYSKEYDOWN</c> message is translated by the <c>TranslateMessage</c>
/// function. It specifies the character code of a system character key that is, a character key that is pressed while the ALT
/// key is down.
/// </para>
/// <para>
/// <code>#define WM_SYSCHAR 0x0106</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The character code of the window menu key.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0 15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke was auto-repeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16 23</term>
/// <term>The scan code. The value depends on the original equipment manufacturer (OEM).</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25 28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// When the context code is zero, the message can be passed to the <c>TranslateAccelerator</c> function, which will handle it as
/// though it were a standard key message instead of a system character-key message. This allows accelerator keys to be used with
/// the active window even if the active window does not have the keyboard focus.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN and arrow keys in the clusters to the left of the numeric keypad; the PRINT SCRN
/// key; the BREAK key; the NUMLOCK key; and the divide (/) and ENTER keys in the numeric keypad. Other keyboards may support the
/// extended-key bit in the parameter.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syschar
WM_SYSCHAR = 0x0106,
/// <summary>
/// <para>
/// Sent to the window with the keyboard focus when a <c>WM_SYSKEYDOWN</c> message is translated by the <c>TranslateMessage</c>
/// function. <c>WM_SYSDEADCHAR</c> specifies the character code of a system dead key that is, a dead key that is pressed while
/// holding down the ALT key.
/// </para>
/// <para>
/// <code>#define WM_SYSDEADCHAR 0x0107</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The character code generated by the system dead key that is, a dead key that is pressed while holding down the ALT key.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>Transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and CTRL keys on the main section of the keyboard;
/// the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the divide
/// (/) and ENTER keys in the numeric keypad. Other keyboards may support the extended-key bit in the lParam parameter.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-sysdeadchar
WM_SYSDEADCHAR = 0x0107,
/// <summary>
/// <para>
/// The <c>WM_UNICHAR</c> message can be used by an application to post input to other windows. This message contains the
/// character code of the key that was pressed. (Test whether a target app can process <c>WM_UNICHAR</c> messages by sending the
/// message with wParam set to <c>UNICODE_NOCHAR</c>.)
/// </para>
/// <para>
/// <code>#define WM_UNICHAR 0x0109</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The character code of the key.</para>
/// <para>
/// If wParam is <c>UNICODE_NOCHAR</c> and the application processes this message, then return <c>TRUE</c>. The
/// <c>DefWindowProc</c> function will return <c>FALSE</c> (the default).
/// </para>
/// <para>
/// If wParam is not <c>UNICODE_NOCHAR</c>, return <c>FALSE</c>. The Unicode <c>DefWindowProc</c> posts a <c>WM_CHAR</c> message
/// with the same parameters and the ANSI <c>DefWindowProc</c> function posts either one or two <c>WM_CHAR</c> messages with the
/// corresponding ANSI character(s).
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bits</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>
/// The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the
/// user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
/// </term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>The scan code. The value depends on the OEM.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>
/// Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or
/// 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
/// </term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Reserved; do not use.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>The context code. The value is 1 if the ALT key is held down while the key is pressed; otherwise, the value is 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>The previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>The transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.</term>
/// </item>
/// </list>
/// <para>For more detail, see Keystroke Message Flags.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// The <c>WM_UNICHAR</c> message is similar to <c>WM_CHAR</c>, but it uses Unicode Transformation Format (UTF)-32, whereas
/// <c>WM_CHAR</c> uses UTF-16.
/// </para>
/// <para>
/// This message is designed to send or post Unicode characters to ANSI windows and can handle Unicode Supplementary Plane characters.
/// </para>
/// <para>
/// Because there is not necessarily a one-to-one correspondence between keys pressed and character messages generated, the
/// information in the high-order word of the lParam parameter is generally not useful to applications. The information in the
/// high-order word applies only to the most recent <c>WM_KEYDOWN</c> message that precedes the posting of the <c>WM_UNICHAR</c> message.
/// </para>
/// <para>
/// For enhanced 101- and 102-key keyboards, extended keys are the right ALT and the right CTRL keys on the main section of the
/// keyboard; the INS, DEL, HOME, END, PAGE UP, PAGE DOWN and arrow keys in the clusters to the left of the numeric keypad; and
/// the divide (/) and ENTER keys in the numeric keypad. Some other keyboards may support the extended-key bit in the lParam parameter.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-unichar
WM_UNICHAR = 0x0109,
/// <summary>Keyboard message filter value.</summary>
/// <remarks>
/// Use the WM_KEYFIRST and WM_KEYLAST messages to filter for keyboard messages when using the GetMessage and PeekMessage functions.
/// </remarks>
WM_KEYLAST = 0x0109,
/// <summary>
/// <para>
/// Sent immediately before the IME generates the composition string as a result of a keystroke. A window receives this message
/// through its WindowProc function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_STARTCOMPOSITION, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><strong>Returns</strong></para>
/// <para>This message has no return value.</para>
/// <remarks>
/// <para>
/// This message is a notification to an IME window to open its composition window. An application should process this message if
/// it displays composition characters itself.
/// </para>
/// <para>
/// If an application has created an IME window, it should pass this message to that window. The <c>DefWindowProc</c> function
/// processes the message by passing it to the default IME window.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-startcomposition
WM_IME_STARTCOMPOSITION = 0x010D,
/// <summary>
/// <para>
/// Sent to an application when the IME ends composition. A window receives this message through its <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_ENDCOMPOSITION, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><strong>Returns</strong></para>
/// <para>This message has no return value.</para>
/// <remarks>
/// <para>An application should process this message if it displays composition characters itself.</para>
/// <para>
/// If the application has created an IME window, it should pass this message to that window. The <c>DefWindowProc</c> function
/// processes this message by passing it to the default IME window.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-endcomposition
WM_IME_ENDCOMPOSITION = 0x010E,
/// <summary>
/// <para>
/// Sent to an application when the IME changes composition status as a result of a keystroke. A window receives this message
/// through its WindowProc function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_COMPOSITION, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>DBCS character representing the latest change to the composition string.</para>
/// <para><em>lParam</em></para>
/// <para>
/// Value specifying how the composition string or character changed. This parameter can be one or more of the following values.
/// For more information about these values, see IME Composition String Values.
/// </para>
/// <list/>
/// <para>The lParam parameter can also have one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>CS_INSERTCHAR</c></term>
/// <term>
/// Insert the <c>wParam</c> composition character at the current insertion point. An application should display the composition
/// character if it processes this message.
/// </term>
/// </item>
/// <item>
/// <term><c>CS_NOMOVECARET</c></term>
/// <term>
/// Do not move the caret position as a result of processing the message. For example, if an IME specifies a combination of
/// CS_INSERTCHAR and CS_NOMOVECARET, the application should insert the specified character at the current caret position but
/// should not move the caret to the next position. A subsequent WM_IME_COMPOSITION message with GCS_RESULTSTR will replace this character.
/// </term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>This message has no return value.</para>
/// <remarks>
/// <para>
/// An application should process this message if it displays composition characters itself. Otherwise, it should send the
/// message to the IME window.
/// </para>
/// <para>
/// If the application has created an IME window, it should pass this message to that window. The <c>DefWindowProc</c> function
/// processes this message by passing it to the default IME window. The IME window processes this message by updating its
/// appearance based on the change flag specified. An application can call <c>ImmGetCompositionString</c> to retrieve the new
/// composition status.
/// </para>
/// <para>
/// If none of the GCS_ values are set, the message indicates that the current composition has been canceled and applications
/// that draw the composition string should delete the string.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-composition
WM_IME_COMPOSITION = 0x010F,
/// <summary/>
WM_IME_KEYLAST = 0x010F,
/// <summary>
/// <para>
/// Sent to the dialog box procedure immediately before a dialog box is displayed. Dialog box procedures typically use this
/// message to initialize controls and carry out any other initialization tasks that affect the appearance of the dialog box.
/// </para>
/// <para>
/// <code>#define WM_INITDIALOG 0x0110</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// A handle to the control to receive the default keyboard focus. The system assigns the default keyboard focus only if the
/// dialog box procedure returns <c>TRUE</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// Additional initialization data. This data is passed to the system as the lParam parameter in a call to the
/// <c>CreateDialogIndirectParam</c>, <c>CreateDialogParam</c>, <c>DialogBoxIndirectParam</c>, or <c>DialogBoxParam</c> function
/// used to create the dialog box. For property sheets, this parameter is a pointer to the <c>PROPSHEETPAGE</c> structure used to
/// create the page. This parameter is zero if any other dialog box creation function is used.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The dialog box procedure should return <c>TRUE</c> to direct the system to set the keyboard focus to the control specified by
/// wParam. Otherwise, it should return <c>FALSE</c> to prevent the system from setting the default keyboard focus.
/// </para>
/// <para>
/// The dialog box procedure should return the value directly. The <c>DWL_MSGRESULT</c> value set by the <c>SetWindowLong</c>
/// function is ignored.
/// </para>
/// <remarks>
/// <para>
/// The control to receive the default keyboard focus is always the first control in the dialog box that is visible, not
/// disabled, and that has the <c>WS_TABSTOP</c> style. When the dialog box procedure returns <c>TRUE</c>, the system checks the
/// control to ensure that the procedure has not disabled it. If it has been disabled, the system sets the keyboard focus to the
/// next control that is visible, not disabled, and has the <c>WS_TABSTOP</c>.
/// </para>
/// <para>An application can return <c>FALSE</c> only if it has set the keyboard focus to one of the controls of the dialog box.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dlgbox/wm-initdialog
WM_INITDIALOG = 0x0110,
/// <summary>
/// <para>
/// Sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or
/// when an accelerator keystroke is translated.
/// </para>
/// <para>
/// <code>#define WM_COMMAND 0x0111</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>For a description of this parameter, see Remarks.</para>
/// <para><em>lParam</em></para>
/// <para>For a description of this parameter, see Remarks.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use of the wParam and lParam parameters are summarized here.</para>
/// <list type="table">
/// <listheader>
/// <term>Message Source</term>
/// <term>wParam (high word)</term>
/// <term>wParam (low word)</term>
/// <term>lParam</term>
/// </listheader>
/// <item>
/// <term>Menu</term>
/// <term>0</term>
/// <term>Menu identifier (IDM_*)</term>
/// <term>0</term>
/// </item>
/// <item>
/// <term>Accelerator</term>
/// <term>1</term>
/// <term>Accelerator identifier (IDM_*)</term>
/// <term>0</term>
/// </item>
/// <item>
/// <term>Control</term>
/// <term>Control-defined notification code</term>
/// <term>Control identifier</term>
/// <term>Handle to the control window</term>
/// </item>
/// </list>
/// <para>Menus</para>
/// <para>
/// If an application enables a menu separator, the system sends a <c>WM_COMMAND</c> message with the low-word of the wParam
/// parameter set to zero when the user selects the separator.
/// </para>
/// <para>
/// If a menu is defined with a <c>MENUINFO.dwStyle</c> value of <c>MNS_NOTIFYBYPOS</c>, <c>WM_MENUCOMMAND</c> is sent instead of <c>WM_COMMAND</c>.
/// </para>
/// <para>Accelerators</para>
/// <para>Accelerator keystrokes that select items from the window menu are translated into <c>WM_SYSCOMMAND</c> messages.</para>
/// <para>
/// If an accelerator keystroke occurs that corresponds to a menu item when the window that owns the menu is minimized, no
/// <c>WM_COMMAND</c> message is sent. However, if an accelerator keystroke occurs that does not match any of the items in the
/// window's menu or in the window menu, a <c>WM_COMMAND</c> message is sent, even if the window is minimized.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-command
WM_COMMAND = 0x0111,
/// <summary>
/// <para>
/// A window receives this message when the user chooses a command from the <c>Window</c> menu (formerly known as the system or
/// control menu) or when the user chooses the maximize button, minimize button, restore button, or close button.
/// </para>
/// <para>
/// <code>#define WM_SYSCOMMAND 0x0112</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The type of system command requested. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SC_CLOSE</c> 0xF060</term>
/// <term>Closes the window.</term>
/// </item>
/// <item>
/// <term><c>SC_CONTEXTHELP</c> 0xF180</term>
/// <term>
/// Changes the cursor to a question mark with a pointer. If the user then clicks a control in the dialog box, the control
/// receives a <c>WM_HELP</c> message.
/// </term>
/// </item>
/// <item>
/// <term><c>SC_DEFAULT</c> 0xF160</term>
/// <term>Selects the default item; the user double-clicked the window menu.</term>
/// </item>
/// <item>
/// <term><c>SC_HOTKEY</c> 0xF150</term>
/// <term>
/// Activates the window associated with the application-specified hot key. The <c>lParam</c> parameter identifies the window to activate.
/// </term>
/// </item>
/// <item>
/// <term><c>SC_HSCROLL</c> 0xF080</term>
/// <term>Scrolls horizontally.</term>
/// </item>
/// <item>
/// <term><c>SCF_ISSECURE</c> 0x00000001</term>
/// <term>Indicates whether the screen saver is secure.</term>
/// </item>
/// <item>
/// <term><c>SC_KEYMENU</c> 0xF100</term>
/// <term>Retrieves the window menu as a result of a keystroke. For more information, see the Remarks section.</term>
/// </item>
/// <item>
/// <term><c>SC_MAXIMIZE</c> 0xF030</term>
/// <term>Maximizes the window.</term>
/// </item>
/// <item>
/// <term><c>SC_MINIMIZE</c> 0xF020</term>
/// <term>Minimizes the window.</term>
/// </item>
/// <item>
/// <term><c>SC_MONITORPOWER</c> 0xF170</term>
/// <term>
/// Sets the state of the display. This command supports devices that have power-saving features, such as a battery-powered
/// personal computer. The <c>lParam</c> parameter can have the following values:
/// </term>
/// </item>
/// <item>
/// <term><c>SC_MOUSEMENU</c> 0xF090</term>
/// <term>Retrieves the window menu as a result of a mouse click.</term>
/// </item>
/// <item>
/// <term><c>SC_MOVE</c> 0xF010</term>
/// <term>Moves the window.</term>
/// </item>
/// <item>
/// <term><c>SC_NEXTWINDOW</c> 0xF040</term>
/// <term>Moves to the next window.</term>
/// </item>
/// <item>
/// <term><c>SC_PREVWINDOW</c> 0xF050</term>
/// <term>Moves to the previous window.</term>
/// </item>
/// <item>
/// <term><c>SC_RESTORE</c> 0xF120</term>
/// <term>Restores the window to its normal position and size.</term>
/// </item>
/// <item>
/// <term><c>SC_SCREENSAVE</c> 0xF140</term>
/// <term>Executes the screen saver application specified in the [boot] section of the System.ini file.</term>
/// </item>
/// <item>
/// <term><c>SC_SIZE</c> 0xF000</term>
/// <term>Sizes the window.</term>
/// </item>
/// <item>
/// <term><c>SC_TASKLIST</c> 0xF130</term>
/// <term>Activates the <c>Start</c> menu.</term>
/// </item>
/// <item>
/// <term><c>SC_VSCROLL</c> 0xF070</term>
/// <term>Scrolls vertically.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the horizontal position of the cursor, in screen coordinates, if a window menu command is chosen
/// with the mouse. Otherwise, this parameter is not used.
/// </para>
/// <para>
/// The high-order word specifies the vertical position of the cursor, in screen coordinates, if a window menu command is chosen
/// with the mouse. This parameter is 1 if the command is chosen using a system accelerator, or zero if using a mnemonic.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>To obtain the position coordinates in screen coordinates, use the following code:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); // horizontal position yPos = GET_Y_LPARAM(lParam); // vertical position</code>
/// </para>
/// <para>
/// The <c>DefWindowProc</c> function carries out the window menu request for the predefined actions specified in the previous table.
/// </para>
/// <para>
/// In <c>WM_SYSCOMMAND</c> messages, the four low-order bits of the wParam parameter are used internally by the system. To
/// obtain the correct result when testing the value of wParam, an application must combine the value 0xFFF0 with the wParam
/// value by using the bitwise AND operator.
/// </para>
/// <para>
/// The menu items in a window menu can be modified by using the <c>GetSystemMenu</c>, <c>AppendMenu</c>, <c>InsertMenu</c>,
/// <c>ModifyMenu</c>, <c>InsertMenuItem</c>, and <c>SetMenuItemInfo</c> functions. Applications that modify the window menu must
/// process <c>WM_SYSCOMMAND</c> messages.
/// </para>
/// <para>
/// An application can carry out any system command at any time by passing a <c>WM_SYSCOMMAND</c> message to
/// <c>DefWindowProc</c>. Any <c>WM_SYSCOMMAND</c> messages not handled by the application must be passed to
/// <c>DefWindowProc</c>. Any command values added by an application must be processed by the application and cannot be passed to <c>DefWindowProc</c>.
/// </para>
/// <para>
/// If password protection is enabled by policy, the screen saver is started regardless of what an application does with the
/// <c>SC_SCREENSAVE</c> notification even if fails to pass it to <c>DefWindowProc</c>.
/// </para>
/// <para>
/// Accelerator keys that are defined to choose items from the window menu are translated into <c>WM_SYSCOMMAND</c> messages; all
/// other accelerator keystrokes are translated into <c>WM_COMMAND</c> messages.
/// </para>
/// <para>
/// If the wParam is <c>SC_KEYMENU</c>, lParam contains the character code of the key that is used with the ALT key to display
/// the popup menu. For example, pressing ALT+F to display the File popup will cause a <c>WM_SYSCOMMAND</c> with wParam equal to
/// <c>SC_KEYMENU</c> and lParam equal to 'f'.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand
WM_SYSCOMMAND = 0x0112,
/// <summary>
/// <para>
/// Posted to the installing thread's message queue when a timer expires. The message is posted by the <c>GetMessage</c> or
/// <c>PeekMessage</c> function.
/// </para>
/// <para>
/// <code>#define WM_TIMER 0x0113</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The timer identifier.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to an application-defined callback function that was passed to the <c>SetTimer</c> function when the timer was installed.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// You can process the message by providing a <c>WM_TIMER</c> case in the window procedure. Otherwise, <c>DispatchMessage</c>
/// will call the TimerProc callback function specified in the call to the <c>SetTimer</c> function used to install the timer.
/// </para>
/// <para>
/// The <c>WM_TIMER</c> message is a low-priority message. The <c>GetMessage</c> and <c>PeekMessage</c> functions post this
/// message only when no other higher-priority messages are in the thread's message queue.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-timer
WM_TIMER = 0x0113,
/// <summary>
/// <para>
/// The <c>WM_HSCROLL</c> message is sent to a window when a scroll event occurs in the window's standard horizontal scroll bar.
/// This message is also sent to the owner of a horizontal scroll bar control when a scroll event occurs in the control.
/// </para>
/// <para>A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>WM_HSCROLL WPARAM wParam LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The <c>HIWORD</c> specifies the current position of the scroll box if the <c>LOWORD</c> is SB_THUMBPOSITION or SB_THUMBTRACK;
/// otherwise, this word is not used.
/// </para>
/// <para>
/// The <c>LOWORD</c> specifies a scroll bar value that indicates the user's scrolling request. This word can be one of the
/// following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SB_ENDSCROLL</c></term>
/// <term>Ends scroll.</term>
/// </item>
/// <item>
/// <term><c>SB_LEFT</c></term>
/// <term>Scrolls to the upper left.</term>
/// </item>
/// <item>
/// <term><c>SB_RIGHT</c></term>
/// <term>Scrolls to the lower right.</term>
/// </item>
/// <item>
/// <term><c>SB_LINELEFT</c></term>
/// <term>Scrolls left by one unit.</term>
/// </item>
/// <item>
/// <term><c>SB_LINERIGHT</c></term>
/// <term>Scrolls right by one unit.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGELEFT</c></term>
/// <term>Scrolls left by the width of the window.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGERIGHT</c></term>
/// <term>Scrolls right by the width of the window.</term>
/// </item>
/// <item>
/// <term><c>SB_THUMBPOSITION</c></term>
/// <term>
/// The user has dragged the scroll box (thumb) and released the mouse button. The <c>HIWORD</c> indicates the position of the
/// scroll box at the end of the drag operation.
/// </term>
/// </item>
/// <item>
/// <term><c>SB_THUMBTRACK</c></term>
/// <term>
/// The user is dragging the scroll box. This message is sent repeatedly until the user releases the mouse button. The
/// <c>HIWORD</c> indicates the position that the scroll box has been dragged to.
/// </term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// If the message is sent by a scroll bar control, this parameter is the handle to the scroll bar control. If the message is
/// sent by a standard scroll bar, this parameter is <c>NULL</c>.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The SB_THUMBTRACK request code is typically used by applications that provide feedback as the user drags the scroll box.
/// </para>
/// <para>
/// If an application scrolls the content of the window, it must also reset the position of the scroll box by using the
/// <c>SetScrollPos</c> function.
/// </para>
/// <para>
/// Note that the <c>WM_HSCROLL</c> message carries only 16 bits of scroll box position data. Thus, applications that rely solely
/// on <c>WM_HSCROLL</c> (and <c>WM_VSCROLL</c>) for scroll position data have a practical maximum position value of 65,535.
/// </para>
/// <para>
/// However, because the <c>SetScrollInfo</c>, <c>SetScrollPos</c>, <c>SetScrollRange</c>, <c>GetScrollInfo</c>,
/// <c>GetScrollPos</c>, and <c>GetScrollRange</c> functions support 32-bit scroll bar position data, there is a way to
/// circumvent the 16-bit barrier of the <c>WM_HSCROLL</c> and <c>WM_VSCROLL</c> messages. See <c>GetScrollInfo</c> for a
/// description of the technique.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-hscroll
WM_HSCROLL = 0x0114,
/// <summary>
/// <para>
/// The <c>WM_VSCROLL</c> message is sent to a window when a scroll event occurs in the window's standard vertical scroll bar.
/// This message is also sent to the owner of a vertical scroll bar control when a scroll event occurs in the control.
/// </para>
/// <para>A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>WM_VSCROLL WPARAM wParam LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The <c>HIWORD</c> specifies the current position of the scroll box if the <c>LOWORD</c> is SB_THUMBPOSITION or SB_THUMBTRACK;
/// otherwise, this word is not used.
/// </para>
/// <para>
/// The <c>LOWORD</c> specifies a scroll bar value that indicates the user's scrolling request. This parameter can be one of the
/// following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SB_BOTTOM</c></term>
/// <term>Scrolls to the lower right.</term>
/// </item>
/// <item>
/// <term><c>SB_ENDSCROLL</c></term>
/// <term>Ends scroll.</term>
/// </item>
/// <item>
/// <term><c>SB_LINEDOWN</c></term>
/// <term>Scrolls one line down.</term>
/// </item>
/// <item>
/// <term><c>SB_LINEUP</c></term>
/// <term>Scrolls one line up.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGEDOWN</c></term>
/// <term>Scrolls one page down.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGEUP</c></term>
/// <term>Scrolls one page up.</term>
/// </item>
/// <item>
/// <term><c>SB_THUMBPOSITION</c></term>
/// <term>
/// The user has dragged the scroll box (thumb) and released the mouse button. The <c>HIWORD</c> indicates the position of the
/// scroll box at the end of the drag operation.
/// </term>
/// </item>
/// <item>
/// <term><c>SB_THUMBTRACK</c></term>
/// <term>
/// The user is dragging the scroll box. This message is sent repeatedly until the user releases the mouse button. The
/// <c>HIWORD</c> indicates the position that the scroll box has been dragged to.
/// </term>
/// </item>
/// <item>
/// <term><c>SB_TOP</c></term>
/// <term>Scrolls to the upper left.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// If the message is sent by a scroll bar control, this parameter is the handle to the scroll bar control. If the message is
/// sent by a standard scroll bar, this parameter is <c>NULL</c>.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The SB_THUMBTRACK request code is typically used by applications that provide feedback as the user drags the scroll box.
/// </para>
/// <para>
/// If an application scrolls the content of the window, it must also reset the position of the scroll box by using the
/// <c>SetScrollPos</c> function.
/// </para>
/// <para>
/// Note that the <c>WM_VSCROLL</c> message carries only 16 bits of scroll box position data. Thus, applications that rely solely
/// on <c>WM_VSCROLL</c> (and <c>WM_HSCROLL</c>) for scroll position data have a practical maximum position value of 65,535.
/// </para>
/// <para>
/// However, because the <c>SetScrollInfo</c>, <c>SetScrollPos</c>, <c>SetScrollRange</c>, <c>GetScrollInfo</c>,
/// <c>GetScrollPos</c>, and <c>GetScrollRange</c> functions support 32-bit scroll bar position data, there is a way to
/// circumvent the 16-bit barrier of the <c>WM_HSCROLL</c> and <c>WM_VSCROLL</c> messages. See <c>GetScrollInfo</c> for a
/// description of the technique.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-vscroll
WM_VSCROLL = 0x0115,
/// <summary>
/// <para>
/// Sent when a menu is about to become active. It occurs when the user clicks an item on the menu bar or presses a menu key.
/// This allows the application to modify the menu before it is displayed.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_INITMENU 0x0116</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the menu to be initialized.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// A <c>WM_INITMENU</c> message is sent only when a menu is first accessed; only one <c>WM_INITMENU</c> message is generated for
/// each access. For example, moving the mouse across several menu items while holding down the button does not generate new
/// messages. <c>WM_INITMENU</c> does not provide information about menu items.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-initmenu
WM_INITMENU = 0x0116,
/// <summary>
/// <para>
/// Sent when a drop-down menu or submenu is about to become active. This allows an application to modify the menu before it is
/// displayed, without changing the entire menu.
/// </para>
/// <para>
/// <code>#define WM_INITMENUPOPUP 0x0117</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the drop-down menu or submenu.</para>
/// <para><em>lParam</em></para>
/// <para>The low-order word specifies the zero-based relative position of the menu item that opens the drop-down menu or submenu.</para>
/// <para>
/// The high-order word indicates whether the drop-down menu is the window menu. If the menu is the window menu, this parameter
/// is <c>TRUE</c>; otherwise, it is <c>FALSE</c>.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-initmenupopup
WM_INITMENUPOPUP = 0x0117,
/// <summary>
/// <para>Sent to a menu's owner window when the user selects a menu item.</para>
/// <para>
/// <code>#define WM_MENUSELECT 0x011F</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The low-order word specifies the menu item or submenu index. If the selected item is a command item, this parameter contains
/// the identifier of the menu item. If the selected item opens a drop-down menu or submenu, this parameter contains the index of
/// the drop-down menu or submenu in the main menu, and the lParam parameter contains the handle to the main (clicked) menu; use
/// the <c>GetSubMenu</c> function to get the menu handle to the drop-down menu or submenu.
/// </para>
/// <para>The high-order word specifies one or more menu flags. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MF_BITMAP</c> 0x00000004L</term>
/// <term>Item displays a bitmap.</term>
/// </item>
/// <item>
/// <term><c>MF_CHECKED</c> 0x00000008L</term>
/// <term>Item is checked.</term>
/// </item>
/// <item>
/// <term><c>MF_DISABLED</c> 0x00000002L</term>
/// <term>Item is disabled.</term>
/// </item>
/// <item>
/// <term><c>MF_GRAYED</c> 0x00000001L</term>
/// <term>Item is grayed.</term>
/// </item>
/// <item>
/// <term><c>MF_HILITE</c> 0x00000080L</term>
/// <term>Item is highlighted.</term>
/// </item>
/// <item>
/// <term><c>MF_MOUSESELECT</c> 0x00008000L</term>
/// <term>Item is selected with the mouse.</term>
/// </item>
/// <item>
/// <term><c>MF_OWNERDRAW</c> 0x00000100L</term>
/// <term>Item is an owner-drawn item.</term>
/// </item>
/// <item>
/// <term><c>MF_POPUP</c> 0x00000010L</term>
/// <term>Item opens a drop-down menu or submenu.</term>
/// </item>
/// <item>
/// <term><c>MF_SYSMENU</c> 0x00002000L</term>
/// <term>
/// Item is contained in the window menu. The <c>lParam</c> parameter contains a handle to the menu associated with the message.
/// </term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>A handle to the menu that was clicked.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// If the high-order word of wParam contains 0xFFFF and the lParam parameter contains <c>NULL</c>, the system has closed the menu.
/// </para>
/// <para>
/// Do not use the value 1 for the high-order word of wParam, because this value is specified as ( <c>UINT</c>)
/// <c>HIWORD</c>(wParam). If the value is 0xFFFF, it would be interpreted as 0x0000FFFF, not 1, because of the cast to a <c>UINT</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-menuselect
WM_MENUSELECT = 0x011F,
/// <summary>
/// <para>
/// Sent when a menu is active and the user presses a key that does not correspond to any mnemonic or accelerator key. This
/// message is sent to the window that owns the menu.
/// </para>
/// <para>
/// <code>#define WM_MENUCHAR 0x0120</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word specifies the character code that corresponds to the key the user pressed.</para>
/// <para>The high-order word specifies the active menu type. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MF_POPUP</c> 0x00000010L</term>
/// <term>A drop-down menu, submenu, or shortcut menu.</term>
/// </item>
/// <item>
/// <term><c>MF_SYSMENU</c> 0x00002000L</term>
/// <term>The window menu.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>A handle to the active menu.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// An application that processes this message should return one of the following values in the high-order word of the return value.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>MNC_CLOSE</c> 1</term>
/// <term>Informs the system that it should close the active menu.</term>
/// </item>
/// <item>
/// <term><c>MNC_EXECUTE</c> 2</term>
/// <term>
/// Informs the system that it should choose the item specified in the low-order word of the return value. The owner window
/// receives a <c>WM_COMMAND</c> message.
/// </term>
/// </item>
/// <item>
/// <term><c>MNC_IGNORE</c> 0</term>
/// <term>Informs the system that it should discard the character the user pressed and create a short beep on the system speaker.</term>
/// </item>
/// <item>
/// <term><c>MNC_SELECT</c> 3</term>
/// <term>Informs the system that it should select the item specified in the low-order word of the return value.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>The low-order word is ignored if the high-order word contains 0 or 1.</para>
/// <para>An application should process this message when an accelerator is used to select a menu item that displays a bitmap.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-menuchar
WM_MENUCHAR = 0x0120,
/// <summary>
/// <para>
/// Sent to the owner window of a modal dialog box or menu that is entering an idle state. A modal dialog box or menu enters an
/// idle state when no messages are waiting in its queue after it has processed one or more previous messages.
/// </para>
/// <para>
/// <code>#define WM_ENTERIDLE 0x0121</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MSGF_DIALOGBOX</c> 0</term>
/// <term>The system is idle because a dialog box is displayed.</term>
/// </item>
/// <item>
/// <term><c>MSGF_MENU</c> 2</term>
/// <term>The system is idle because a menu is displayed.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A handle to the dialog box (if wParam is <c>MSGF_DIALOGBOX</c>) or window containing the displayed menu (if wParam is <c>MSGF_MENU</c>).
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// You can suppress the <c>WM_ENTERIDLE</c> message for a dialog box by creating the dialog box with the <c>DS_NOIDLEMSG</c> style.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dlgbox/wm-enteridle
WM_ENTERIDLE = 0x0121,
/// <summary>
/// <para>Sent when the user releases the right mouse button while the cursor is on a menu item.</para>
/// <para>
/// <code>#define WM_MENURBUTTONUP 0x0122</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The zero-based index of the menu item on which the right mouse button was released.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the menu containing the item.</para>
/// <remarks>
/// The <c>WM_MENURBUTTONUP</c> message allows applications to provide a context-sensitive menu also known as a shortcut menu for
/// the menu item specified in this message. To display a context-sensitive menu for a menu item, call the
/// <c>TrackPopupMenuEx</c> function with <c>TPM_RECURSE</c>.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-menurbuttonup
WM_MENURBUTTONUP = 0x0122,
/// <summary>
/// <para>Sent to the owner of a drag-and-drop menu when the user drags a menu item.</para>
/// <para>
/// <code>#define WM_MENUDRAG 0x0123</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The position of the item where the drag operation began.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the menu containing the item.</para>
/// <para><strong>Returns</strong></para>
/// <para>The application should return one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>MND_CONTINUE</c> 0</term>
/// <term>Menu should remain active. If the mouse is released, it should be ignored.</term>
/// </item>
/// <item>
/// <term><c>MND_ENDMENU</c> 1</term>
/// <term>Menu should be ended.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>The application can call the <c>DoDragDrop</c> function in response to this message.</para>
/// <para>To create a drag-and-drop menu, call <c>SetMenuInfo</c> with <c>MNS_DRAGDROP</c>.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-menudrag
WM_MENUDRAG = 0x0123,
/// <summary>
/// <para>
/// Sent to the owner of a drag-and-drop menu when the mouse cursor enters a menu item or moves from the center of the item to
/// the top or bottom of the item.
/// </para>
/// <para>
/// <code>#define WM_MENUGETOBJECT 0x0124</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a <c>MENUGETOBJECTINFO</c> structure.</para>
/// <para><strong>Returns</strong></para>
/// <para>The application should return one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>MNGO_NOERROR</c> 0x00000001</term>
/// <term>An interface pointer was returned in the <c>pvObj</c> member of <c>MENUGETOBJECTINFO</c></term>
/// </item>
/// <item>
/// <term><c>MNGO_NOINTERFACE</c> 0x00000000</term>
/// <term>The interface is not supported.</term>
/// </item>
/// </list>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-menugetobject
WM_MENUGETOBJECT = 0x0124,
/// <summary>
/// <para>Sent when a drop-down menu or submenu has been destroyed.</para>
/// <para>
/// <code>#define WM_UNINITMENUPOPUP 0x0125</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the menu</para>
/// <para><em>lParam</em></para>
/// <para>
/// The high-order word identifies the menu that was destroyed. Currently, this parameter can only be <c>MF_SYSMENU</c> (the
/// window menu).
/// </para>
/// <remarks>If an application receives a <c>WM_INITMENUPOPUP</c> message, it will receive a <c>WM_UNINITMENUPOPUP</c> message.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-uninitmenupopup
WM_UNINITMENUPOPUP = 0x0125,
/// <summary>
/// <para>Sent when the user makes a selection from a menu.</para>
/// <para>
/// <code>#define WM_MENUCOMMAND 0x0126</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The zero-based index of the item selected.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the menu for the item selected.</para>
/// <remarks>
/// <para>
/// The <c>WM_MENUCOMMAND</c> message gives you a handle to the menu so you can access the menu data in the <c>MENUINFO</c>
/// structure and also gives you the index of the selected item, which is typically what applications need. In contrast, the
/// <c>WM_COMMAND</c> message gives you the menu item identifier.
/// </para>
/// <para>
/// The <c>WM_MENUCOMMAND</c> message is sent only for menus that are defined with the <c>MNS_NOTIFYBYPOS</c> flag set in the
/// <c>dwStyle</c> member of the <c>MENUINFO</c> structure.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-menucommand
WM_MENUCOMMAND = 0x0126,
/// <summary>
/// <para>An application sends the <c>WM_CHANGEUISTATE</c> message to indicate that the UI state should be changed.</para>
/// <para>
/// <code>#define WM_CHANGEUISTATE 0x0127</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word specifies the action to be taken. This member can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>UIS_CLEAR</c> 2</term>
/// <term>The UI state flags specified by the high-order word should be cleared.</term>
/// </item>
/// <item>
/// <term><c>UIS_INITIALIZE</c> 3</term>
/// <term>
/// The UI state flags specified by the high-order word should be changed based on the last input event. For more information,
/// see Remarks.
/// </term>
/// </item>
/// <item>
/// <term><c>UIS_SET</c> 1</term>
/// <term>The UI state flags specified by the high-order word should be set.</term>
/// </item>
/// </list>
/// <para>
/// The high-order word specifies which UI state elements are affected or the style of the control. This member can be one or
/// more of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>UISF_ACTIVE</c> 0x4</term>
/// <term>A control should be drawn in the style used for active controls.</term>
/// </item>
/// <item>
/// <term><c>UISF_HIDEACCEL</c> 0x2</term>
/// <term>Keyboard accelerators are hidden.</term>
/// </item>
/// <item>
/// <term><c>UISF_HIDEFOCUS</c> 0x1</term>
/// <term>Focus indicators are hidden.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be 0.</para>
/// <remarks>
/// <para>
/// A window should send this message to itself or its parent when it must change the UI state elements of all windows in the
/// same hierarchy. The window procedure must let <c>DefWindowProc</c> process this message so that the entire window tree has a
/// consistent UI state. When the top-level window receives the <c>WM_CHANGEUISTATE</c> message, it sends a
/// <c>WM_UPDATEUISTATE</c> message with the same parameters to all child windows. When the system processes the
/// <c>WM_UPDATEUISTATE</c> message, it makes the change in the UI state.
/// </para>
/// <para>
/// If the low-order word of wParam is UIS_INITIALIZE, the system will send the <c>WM_UPDATEUISTATE</c> message with a UI state
/// based on the last input event. For example, if the last input came from the mouse, the system will hide the keyboard cues.
/// And, if the last input came from the keyboard, the system will show the keyboard cues. If the state that results from
/// processing <c>WM_CHANGEUISTATE</c> is the same as the old state, <c>DefWindowProc</c> does not send this message.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-changeuistate
WM_CHANGEUISTATE = 0x0127,
/// <summary>
/// <para>
/// An application sends the <c>WM_UPDATEUISTATE</c> message to change the UI state for the specified window and all its child windows.
/// </para>
/// <para>
/// <code>#define WM_UPDATEUISTATE 0x0128</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word specifies the action to be performed. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>UIS_CLEAR</c> 2</term>
/// <term>The UI state element specified by the high-order word should be hidden.</term>
/// </item>
/// <item>
/// <term><c>UIS_INITIALIZE</c> 3</term>
/// <term>
/// The UI state element specified by the high-order word should be changed based on the last input event. For more information,
/// see Remarks.
/// </term>
/// </item>
/// <item>
/// <term><c>UIS_SET</c> 1</term>
/// <term>The UI state element specified by the high-order word should be visible.</term>
/// </item>
/// </list>
/// <para>
/// The high-order word specifies which UI state elements are affected or the style of the control. This parameter can be one or
/// more of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>UISF_ACTIVE</c> 0x4</term>
/// <term>A control should be drawn in the style used for active controls.</term>
/// </item>
/// <item>
/// <term><c>UISF_HIDEACCEL</c> 0x2</term>
/// <term>Keyboard accelerators.</term>
/// </item>
/// <item>
/// <term><c>UISF_HIDEFOCUS</c> 0x1</term>
/// <term>Focus indicators.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <remarks>
/// <para>
/// A window should send this message to change the UI state of all its child windows. In contrast to the <c>WM_CHANGEUISTATE</c>
/// message, which is a notification, when <c>DefWindowProc</c> processes the <c>WM_UPDATEUISTATE</c> message it changes the UI
/// state and propagates the changes to all child windows.
/// </para>
/// <para>
/// The <c>DefWindowProc</c> function updates the UI state according to the wParam value. If the UI state is modified, the
/// function sends the message to all the immediate child windows. <c>DefWindowProc</c> also sends this message when it receives
/// a <c>WM_CHANGEUISTATE</c> message notifying the system that a child window intends to modify the UI state.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-updateuistate
WM_UPDATEUISTATE = 0x0128,
/// <summary>
/// <para>An application sends the <c>WM_QUERYUISTATE</c> message to retrieve the UI state for a window.</para>
/// <para>
/// <code>#define WM_QUERYUISTATE 0x0129</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be 0.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be 0.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// The return value is <c>NULL</c> if the focus indicators and the keyboard accelerators are visible. Otherwise, the return
/// value can be one or more of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code/value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term><c>UISF_ACTIVE</c> 0x4</term>
/// <term>A control should be drawn in the style used for active controls.</term>
/// </item>
/// <item>
/// <term><c>UISF_HIDEACCEL</c> 0x2</term>
/// <term>Keyboard accelerators are hidden.</term>
/// </item>
/// <item>
/// <term><c>UISF_HIDEFOCUS</c> 0x1</term>
/// <term>Focus indicators are hidden.</term>
/// </item>
/// </list>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-queryuistate
WM_QUERYUISTATE = 0x0129,
/// <summary>
/// <para>
/// The WM_CTLCOLORMSGBOX message is sent to the owner window of a message box before Windows draws the message box. By
/// responding to this message, the owner window can set the text and background colors of the message box by using the given
/// display device context handle.
/// </para>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Type: HDC. Identifies the device context for the message box.</para>
/// <para><em>lParam</em></para>
/// <para>Type: HWND. Identifies the message box.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it must return the handle of a brush. Windows uses the brush to paint the
/// background of the message box.
/// </para>
/// </summary>
/// <remarks>
/// <para>The WM_CTLCOLORMSGBOX message is never sent between threads. It is sent only within one thread.</para>
/// </remarks>
WM_CTLCOLORMSGBOX = 0x0132,
/// <summary>
/// <para>
/// An edit control that is not read-only or disabled sends the <c>WM_CTLCOLOREDIT</c> message to its parent window when the
/// control is about to be drawn. By responding to this message, the parent window can use the specified device context handle to
/// set the text and background colors of the edit control.
/// </para>
/// <para>
/// <code>WM_CTLCOLOREDIT WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the device context for the edit control window.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the edit control.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it must return the handle of a brush. The system uses the brush to paint the
/// background of the edit control.
/// </para>
/// <remarks>
/// <para>
/// If the application returns a brush that it created (for example, by using the <c>CreateSolidBrush</c> or
/// <c>CreateBrushIndirect</c> function), the application must free the brush. If the application returns a system brush (for
/// example, one that was retrieved by the <c>GetStockObject</c> or <c>GetSysColorBrush</c> function), the application does not
/// need to free the brush.
/// </para>
/// <para>By default, the <c>DefWindowProc</c> function selects the default system colors for the edit control.</para>
/// <para>
/// Read-only or disabled edit controls do not send the <c>WM_CTLCOLOREDIT</c> message; instead, they send the
/// <c>WM_CTLCOLORSTATIC</c> message.
/// </para>
/// <para>The <c>WM_CTLCOLOREDIT</c> message is never sent between threads, it is only sent within the same thread.</para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>INT_PTR</c> and return the
/// value directly. If the dialog box procedure returns <c>FALSE</c>, then default message handling is performed. The
/// DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// <para>
/// <c>Rich Edit:</c> This message is not supported. To set the background color for a rich edit control, use the
/// <c>EM_SETBKGNDCOLOR</c> message.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-ctlcoloredit
WM_CTLCOLOREDIT = 0x0133,
/// <summary>
/// <para>
/// Sent to the parent window of a list box before the system draws the list box. By responding to this message, the parent
/// window can set the text and background colors of the list box by using the specified display device context handle.
/// </para>
/// <para>
/// <code>WM_CTLCOLORLISTBOX WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Handle to the device context for the list box.</para>
/// <para><em>lParam</em></para>
/// <para>Handle to the list box.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the
/// background of the list box.
/// </para>
/// <remarks>
/// <para>By default, the <c>DefWindowProc</c> function selects the default system colors for the list box.</para>
/// <para>The <c>WM_CTLCOLORLISTBOX</c> message is never sent between threads. It is sent only within one thread.</para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>INT_PTR</c> and return the
/// value directly. If the dialog box procedure returns <c>FALSE</c>, then default message handling is performed. The
/// <c>DWL_MSGRESULT</c> value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-ctlcolorlistbox
WM_CTLCOLORLISTBOX = 0x0134,
/// <summary>
/// <para>
/// The <c>WM_CTLCOLORBTN</c> message is sent to the parent window of a button before drawing the button. The parent window can
/// change the button's text and background colors. However, only owner-drawn buttons respond to the parent window processing
/// this message.
/// </para>
/// <para>
/// <code>WM_CTLCOLORBTN WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>An <c>HDC</c> that specifies the handle to the display context for the button.</para>
/// <para><em>lParam</em></para>
/// <para>An <c>HWND</c> that specifies the handle to the button.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the
/// background of the button.
/// </para>
/// <remarks>
/// <para>
/// If the application returns a brush that it created (for example, by using the <c>CreateSolidBrush</c> or
/// <c>CreateBrushIndirect</c> function), the application must free the brush. If the application returns a system brush (for
/// example, one that was retrieved by the <c>GetStockObject</c> or <c>GetSysColorBrush</c> function), the application does not
/// need to free the brush.
/// </para>
/// <para>
/// By default, the <c>DefWindowProc</c> function selects the default system colors for the button. Buttons with the
/// <c>BS_PUSHBUTTON</c>, <c>BS_DEFPUSHBUTTON</c>, or <c>BS_PUSHLIKE</c> styles do not use the returned brush. Buttons with these
/// styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face,
/// highlight, and shadow-but the <c>WM_CTLCOLORBTN</c> message allows only one brush to be returned. To provide a custom
/// appearance for push buttons, use an owner-drawn button. For more information, see Creating Owner-Drawn Controls.
/// </para>
/// <para>The <c>WM_CTLCOLORBTN</c> message is never sent between threads. It is sent only within one thread.</para>
/// <para>
/// The text color of a check box or radio button applies to the box or button, its check mark, and the text. The focus rectangle
/// for these buttons remains the system default color (typically black). The text color of a group box applies to the text but
/// not to the line that defines the box. The text color of a push button applies only to its focus rectangle; it does not affect
/// the color of the text.
/// </para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>INT_PTR</c> and return the
/// value directly. If the dialog box procedure returns <c>FALSE</c>, then default message handling is performed. The
/// DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-ctlcolorbtn
WM_CTLCOLORBTN = 0x0135,
/// <summary>
/// <para>
/// Sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text
/// and background colors using the specified display device context handle.
/// </para>
/// <para>
/// <code>#define WM_CTLCOLORDLG 0x0136</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the device context for the dialog box.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the dialog box.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the
/// background of the dialog box.
/// </para>
/// <remarks>
/// <para>By default, the <c>DefWindowProc</c> function selects the default system colors for the dialog box.</para>
/// <para>
/// The system does not automatically destroy the returned brush. It is the application's responsibility to destroy the brush
/// when it is no longer needed.
/// </para>
/// <para>The <c>WM_CTLCOLORDLG</c> message is never sent between threads. It is sent only within one thread.</para>
/// <para>
/// Note that the <c>WM_CTLCOLORDLG</c> message is sent to the dialog box itself; all of the other <c>WM_CTLCOLOR*</c> messages
/// are sent to the owner of the control.
/// </para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to an <c>INT_PTR</c> and return the
/// value directly. If the dialog box procedure returns <c>FALSE</c>, then default message handling is performed. The
/// <c>DWL_MSGRESULT</c> value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dlgbox/wm-ctlcolordlg
WM_CTLCOLORDLG = 0x0136,
/// <summary>
/// <para>
/// The <c>WM_CTLCOLORSCROLLBAR</c> message is sent to the parent window of a scroll bar control when the control is about to be
/// drawn. By responding to this message, the parent window can use the display context handle to set the background color of the
/// scroll bar control.
/// </para>
/// <para>A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>WM_CTLCOLORSCROLLBAR WPARAM wParam LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Handle to the device context for the scroll bar control.</para>
/// <para><em>lParam</em></para>
/// <para>Handle to the scroll bar.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it must return the handle to a brush. The system uses the brush to paint the
/// background of the scroll bar control.
/// </para>
/// <remarks>
/// <para>
/// If the application returns a brush that it created (for example, by using the <c>CreateSolidBrush</c> or
/// <c>CreateBrushIndirect</c> function), the application must free the brush. If the application returns a system brush (for
/// example, one that was retrieved by the <c>GetStockObject</c> or <c>GetSysColorBrush</c> function), the application does not
/// need to free the brush.
/// </para>
/// <para>By default, the <c>DefWindowProc</c> function selects the default system colors for the scroll bar control.</para>
/// <para>The <c>WM_CTLCOLORSCROLLBAR</c> message is never sent between threads; it is only sent within the same thread.</para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>INT_PTR</c> and return the
/// value directly. If the dialog box procedure returns <c>FALSE</c>, then default message handling is performed. The
/// DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// <para>
/// The <c>WM_CTLCOLORSCROLLBAR</c> message is used only by child scroll bar controls. Scrollbars attached to a window (WS_SCROLL
/// and WS_VSCROLL) do not generate this message. To customize the appearance of scrollbars attached to a window, use the flat
/// scroll bar functions.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-ctlcolorscrollbar
WM_CTLCOLORSCROLLBAR = 0x0137,
/// <summary>
/// <para>
/// A static control, or an edit control that is read-only or disabled, sends the <c>WM_CTLCOLORSTATIC</c> message to its parent
/// window when the control is about to be drawn. By responding to this message, the parent window can use the specified device
/// context handle to set the text foreground and background colors of the static control.
/// </para>
/// <para>A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>WM_CTLCOLORSTATIC WPARAM wParam; LPARAM lParam;</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Handle to the device context for the static control window.</para>
/// <para><em>lParam</em></para>
/// <para>Handle to the static control.</para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, the return value is a handle to a brush that the system uses to paint the
/// background of the static control.
/// </para>
/// <remarks>
/// <para>
/// If the application returns a brush that it created (for example, by using the <c>CreateSolidBrush</c> or
/// <c>CreateBrushIndirect</c> function), the application must free the brush. If the application returns a system brush (for
/// example, one that was retrieved by the <c>GetStockObject</c> or <c>GetSysColorBrush</c> function), the application does not
/// need to free the brush.
/// </para>
/// <para>By default, the <c>DefWindowProc</c> function selects the default system colors for the static control.</para>
/// <para>
/// You can set the text background color of a disabled edit control, but you cannot set the text foreground color. The system
/// always uses COLOR_GRAYTEXT.
/// </para>
/// <para>
/// Edit controls that are not read-only or disabled do not send the <c>WM_CTLCOLORSTATIC</c> message; instead, they send the
/// <c>WM_CTLCOLOREDIT</c> message.
/// </para>
/// <para>The <c>WM_CTLCOLORSTATIC</c> message is never sent between threads; it is sent only within the same thread.</para>
/// <para>
/// If a dialog box procedure handles this message, it should cast the desired return value to a <c>INT_PTR</c> and return the
/// value directly. If the dialog box procedure returns <c>FALSE</c>, then default message handling is performed. The
/// DWL_MSGRESULT value set by the <c>SetWindowLong</c> function is ignored.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-ctlcolorstatic
WM_CTLCOLORSTATIC = 0x0138,
/// <summary>The first mouse related message.</summary>
WM_MOUSEFIRST = 0x0200,
/// <summary>
/// <para>
/// Posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the
/// cursor. Otherwise, the message is posted to the window that has captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOUSEMOVE 0x0200</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousemove
WM_MOUSEMOVE = 0x0200,
/// <summary>
/// <para>
/// Posted when the user presses the left mouse button while the cursor is in the client area of a window. If the mouse is not
/// captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_LBUTTONDOWN 0x0201</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// To detect that the ALT key was pressed, check whether <c>GetKeyState</c> with <c>VK_MENU</c> &lt; 0. Note, this must not be <c>GetAsyncKeyState</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-lbuttondown
WM_LBUTTONDOWN = 0x0201,
/// <summary>
/// <para>
/// Posted when the user releases the left mouse button while the cursor is in the client area of a window. If the mouse is not
/// captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_LBUTTONUP 0x0202</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the lParam value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-lbuttonup
WM_LBUTTONUP = 0x0202,
/// <summary>
/// <para>
/// Posted when the user double-clicks the left mouse button while the cursor is in the client area of a window. If the mouse is
/// not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_LBUTTONDBLCLK 0x0203</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// Only windows that have the <c>CS_DBLCLKS</c> style can receive <c>WM_LBUTTONDBLCLK</c> messages, which the system generates
/// whenever the user presses, releases, and again presses the left mouse button within the system's double-click time limit.
/// Double-clicking the left mouse button actually generates a sequence of four messages: <c>WM_LBUTTONDOWN</c>,
/// <c>WM_LBUTTONUP</c>, <c>WM_LBUTTONDBLCLK</c>, and <c>WM_LBUTTONUP</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-lbuttondblclk
WM_LBUTTONDBLCLK = 0x0203,
/// <summary>
/// <para>
/// Posted when the user presses the right mouse button while the cursor is in the client area of a window. If the mouse is not
/// captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_RBUTTONDOWN 0x0204</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// To detect that the ALT key was pressed, check whether <c>GetKeyState</c> with <c>VK_MENU</c> &lt; 0. Note, this must not be <c>GetAsyncKeyState</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-rbuttondown
WM_RBUTTONDOWN = 0x0204,
/// <summary>
/// <para>
/// Posted when the user releases the right mouse button while the cursor is in the client area of a window. If the mouse is not
/// captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_RBUTTONUP 0x0205</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-rbuttonup
WM_RBUTTONUP = 0x0205,
/// <summary>
/// <para>
/// Posted when the user double-clicks the right mouse button while the cursor is in the client area of a window. If the mouse is
/// not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_RBUTTONDBLCLK 0x0206</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// Only windows that have the <c>CS_DBLCLKS</c> style can receive <c>WM_RBUTTONDBLCLK</c> messages, which the system generates
/// whenever the user presses, releases, and again presses the right mouse button within the system's double-click time limit.
/// Double-clicking the right mouse button actually generates four messages: <c>WM_RBUTTONDOWN</c>, <c>WM_RBUTTONUP</c>,
/// <c>WM_RBUTTONDBLCLK</c>, and <c>WM_RBUTTONUP</c> again.
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-rbuttondblclk
WM_RBUTTONDBLCLK = 0x0206,
/// <summary>
/// <para>
/// Posted when the user presses the middle mouse button while the cursor is in the client area of a window. If the mouse is not
/// captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MBUTTONDOWN 0x0207</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// To detect that the ALT key was pressed, check whether <c>GetKeyState</c> with <c>VK_MENU</c> &lt; 0. Note, this must not be <c>GetAsyncKeyState</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mbuttondown
WM_MBUTTONDOWN = 0x0207,
/// <summary>
/// <para>
/// Posted when the user releases the middle mouse button while the cursor is in the client area of a window. If the mouse is not
/// captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MBUTTONUP 0x0208</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// Note that when a shortcut menu is present (displayed), coordinates are relative to the screen, not the client area. Because
/// <c>TrackPopupMenu</c> is an asynchronous call and the <c>WM_MBUTTONUP</c> notification does not have a special flag
/// indicating coordinate derivation, an application cannot tell if the x,y coordinates contained in lParam are relative to the
/// screen or the client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mbuttonup
WM_MBUTTONUP = 0x0208,
/// <summary>
/// <para>
/// Posted when the user double-clicks the middle mouse button while the cursor is in the client area of a window. If the mouse
/// is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that
/// has captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MBUTTONDBLCLK 0x0209</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// Only windows that have the <c>CS_DBLCLKS</c> style can receive <c>WM_MBUTTONDBLCLK</c> messages, which the system generates
/// when the user presses, releases, and again presses the middle mouse button within the system's double-click time limit.
/// Double-clicking the middle mouse button actually generates four messages: <c>WM_MBUTTONDOWN</c>, <c>WM_MBUTTONUP</c>,
/// <c>WM_MBUTTONDBLCLK</c>, and <c>WM_MBUTTONUP</c> again.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mbuttondblclk
WM_MBUTTONDBLCLK = 0x0209,
/// <summary>
/// <para>
/// Sent to the focus window when the mouse wheel is rotated. The <c>DefWindowProc</c> function propagates the message to the
/// window's parent. There should be no internal forwarding of the message, since <c>DefWindowProc</c> propagates it up the
/// parent chain until it finds a window that processes it.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOUSEWHEEL 0x020A</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The high-order word indicates the distance the wheel is rotated, expressed in multiples or divisions of <c>WHEEL_DELTA</c>,
/// which is 120. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates
/// that the wheel was rotated backward, toward the user.
/// </para>
/// <para>
/// The low-order word indicates whether various virtual keys are down. This parameter can be one or more of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>The low-order word specifies the x-coordinate of the pointer, relative to the upper-left corner of the screen.</para>
/// <para>The high-order word specifies the y-coordinate of the pointer, relative to the upper-left corner of the screen.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter:</para>
/// <para>
/// <code>fwKeys = GET_KEYSTATE_WPARAM(wParam); zDelta = GET_WHEEL_DELTA_WPARAM(wParam);</code>
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// The wheel rotation will be a multiple of <c>WHEEL_DELTA</c>, which is set at 120. This is the threshold for action to be
/// taken, and one such action (for example, scrolling one increment) should occur for each delta.
/// </para>
/// <para>
/// The delta was set to 120 to allow Microsoft or other vendors to build finer-resolution wheels (a freely-rotating wheel with
/// no notches) to send more messages per rotation, but with a smaller value in each message. To use this feature, you can either
/// add the incoming delta values until <c>WHEEL_DELTA</c> is reached (so for a delta-rotation you get the same response), or
/// scroll partial lines in response to the more frequent messages. You can also choose your scroll granularity and accumulate
/// deltas until it is reached.
/// </para>
/// <para>Note, there is no fwKeys for <c>MSH_MOUSEWHEEL</c>. Otherwise, the parameters are exactly the same as for <c>WM_MOUSEWHEEL</c>.</para>
/// <para>
/// It is up to the application to forward <c>MSH_MOUSEWHEEL</c> to any embedded objects or controls. The application is required
/// to send the message to an active embedded OLE application. It is optional that the application sends it to a wheel-enabled
/// control with focus. If the application does send the message to a control, it can check the return value to see if the
/// message was processed. Controls are required to return a value of <c>TRUE</c> if they process the message.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousewheel
WM_MOUSEWHEEL = 0x020A,
/// <summary>
/// <para>
/// Posted when the user presses the first or second X button while the cursor is in the client area of a window. If the mouse is
/// not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has
/// captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_XBUTTONDOWN 0x020B</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word indicates whether various virtual keys are down. It can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para>The high-order word indicates which button was clicked. It can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>XBUTTON1</c> 0x0001</term>
/// <term>The first X button was clicked.</term>
/// </item>
/// <item>
/// <term><c>XBUTTON2</c> 0x0002</term>
/// <term>The second X button was clicked.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter:</para>
/// <para>
/// <code>fwKeys = GET_KEYSTATE_WPARAM (wParam); fwButton = GET_XBUTTON_WPARAM (wParam);</code>
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// Unlike the <c>WM_LBUTTONDOWN</c>, <c>WM_MBUTTONDOWN</c>, and <c>WM_RBUTTONDOWN</c> messages, an application should return
/// <c>TRUE</c> from this message if it processes it. Doing so allows software that simulates this message on Windows systems
/// earlier than Windows 2000 to determine whether the window procedure processed the message or called <c>DefWindowProc</c> to
/// process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-xbuttondown
WM_XBUTTONDOWN = 0x020B,
/// <summary>
/// <para>
/// Posted when the user releases the first or second X button while the cursor is in the client area of a window. If the mouse
/// is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that
/// has captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_XBUTTONUP 0x020C</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word indicates whether various virtual keys are down. It can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para>The high-order word indicates which button was released. It can be one of the following values:</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>XBUTTON1</c> 0x0001</term>
/// <term>The first X button was released.</term>
/// </item>
/// <item>
/// <term><c>XBUTTON2</c> 0x0002</term>
/// <term>The second X button was released.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter:</para>
/// <para>
/// <code>fwKeys = GET_KEYSTATE_WPARAM (wParam); fwButton = GET_XBUTTON_WPARAM (wParam);</code>
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// Unlike the <c>WM_LBUTTONUP</c>, <c>WM_MBUTTONUP</c>, and <c>WM_RBUTTONUP</c> messages, an application should return
/// <c>TRUE</c> from this message if it processes it. Doing so will allow software that simulates this message on Windows systems
/// earlier than Windows 2000 to determine whether the window procedure processed the message or called <c>DefWindowProc</c> to
/// process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-xbuttonup
WM_XBUTTONUP = 0x020C,
/// <summary>
/// <para>
/// Posted when the user double-clicks the first or second X button while the cursor is in the client area of a window. If the
/// mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window
/// that has captured the mouse.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_XBUTTONDBLCLK 0x020D</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The low-order word indicates whether various virtual keys are down. It can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para>The high-order word indicates which button was double-clicked. It can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>XBUTTON1</c> 0x0001</term>
/// <term>The first X button was double-clicked.</term>
/// </item>
/// <item>
/// <term><c>XBUTTON2</c> 0x0002</term>
/// <term>The second X button was double-clicked.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>Use the following code to get the information in the wParam parameter:</para>
/// <para>
/// <code>fwKeys = GET_KEYSTATE_WPARAM (wParam); fwButton = GET_XBUTTON_WPARAM (wParam);</code>
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// Only windows that have the <c>CS_DBLCLKS</c> style can receive <c>WM_XBUTTONDBLCLK</c> messages, which the system generates
/// whenever the user presses, releases, and again presses an X button within the system's double-click time limit.
/// Double-clicking one of these buttons actually generates four messages: <c>WM_XBUTTONDOWN</c>, <c>WM_XBUTTONUP</c>,
/// <c>WM_XBUTTONDBLCLK</c>, and <c>WM_XBUTTONUP</c> again.
/// </para>
/// <para>
/// Unlike the <c>WM_LBUTTONDBLCLK</c>, <c>WM_MBUTTONDBLCLK</c>, and <c>WM_RBUTTONDBLCLK</c> messages, an application should
/// return <c>TRUE</c> from this message if it processes it. Doing so will allow software that simulates this message on Windows
/// systems earlier than Windows 2000 to determine whether the window procedure processed the message or called
/// <c>DefWindowProc</c> to process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-xbuttondblclk
WM_XBUTTONDBLCLK = 0x020D,
/// <summary>
/// <para>
/// Sent to the active window when the mouse's horizontal scroll wheel is tilted or rotated. The <c>DefWindowProc</c> function
/// propagates the message to the window's parent. There should be no internal forwarding of the message, since
/// <c>DefWindowProc</c> propagates it up the parent chain until it finds a window that processes it.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOUSEHWHEEL 0x020E</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The high-order word indicates the distance the wheel is rotated, expressed in multiples or factors of <c>WHEEL_DELTA</c>,
/// which is set to 120. A positive value indicates that the wheel was rotated to the right; a negative value indicates that the
/// wheel was rotated to the left.
/// </para>
/// <para>
/// The low-order word indicates whether various virtual keys are down. This parameter can be one or more of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>The low-order word specifies the x-coordinate of the pointer, relative to the upper-left corner of the screen.</para>
/// <para>The high-order word specifies the y-coordinate of the pointer, relative to the upper-left corner of the screen.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>Use the following code to obtain the information in the wParam parameter.</para>
/// <para>
/// <code>fwKeys = GET_KEYSTATE_WPARAM(wParam); zDelta = GET_WHEEL_DELTA_WPARAM(wParam);</code>
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position.</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// <para>
/// The wheel rotation is a multiple of <c>WHEEL_DELTA</c>, which is set to 120. This is the threshold for action to be taken,
/// and one such action (for example, scrolling one increment) should occur for each delta.
/// </para>
/// <para>
/// The delta was set to 120 to allow Microsoft or other vendors to build finer-resolution wheels (for example, a freely-rotating
/// wheel with no notches) to send more messages per rotation, but with a smaller value in each message. To use this feature, you
/// can either add the incoming delta values until <c>WHEEL_DELTA</c> is reached (so for a delta-rotation you get the same
/// response), or scroll partial lines in response to more frequent messages. You can also choose your scroll granularity and
/// accumulate deltas until it is reached.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousehwheel
WM_MOUSEHWHEEL = 0x020E,
/// <summary>The last mouse related message.</summary>
WM_MOUSELAST = 0x020E,
/// <summary>
/// <para>
/// Sent to a window when a significant action occurs on a descendant window. This message is now extended to include the
/// <c>WM_POINTERDOWN</c> event. When the child window is being created, the system sends <c>WM_PARENTNOTIFY</c> just before the
/// <c>CreateWindow</c> or <c>CreateWindowEx</c> function that creates the window returns. When the child window is being
/// destroyed, the system sends the message before any processing to destroy the window takes place.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <para>
/// [!Important] Desktop apps should be DPI aware. If your app is not DPI aware, screen coordinates contained in pointer messages
/// and related structures might appear inaccurate due to DPI virtualization. DPI virtualization provides automatic scaling
/// support to applications that are not DPI aware and is active by default (users can turn it off). For more information, see
/// Writing High-DPI Win32 Applications.
/// </para>
/// </para>
/// <para>
/// <code>#define WM_PARENTNOTIFY 0x0210</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The low-order word of wParam specifies the event for which the parent is being notified. The value of the high-order word
/// depends on the value of the low-order word. This parameter can be one of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>LOWORD( <c>wParam</c>)</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>WM_CREATE</c> 0x0001</term>
/// <term>
/// The child window is being created. HIWORD( <c>wParam</c>) is the identifier of the child window. <c>lParam</c> is a handle to
/// the child window.
/// </term>
/// </item>
/// <item>
/// <term><c>WM_DESTROY</c> 0x0002</term>
/// <term>
/// The child window is being destroyed. HIWORD( <c>wParam</c>) is the identifier of the child window. <c>lParam</c> is a handle
/// to the child window.
/// </term>
/// </item>
/// <item>
/// <term><c>WM_LBUTTONDOWN</c> 0x0201</term>
/// <term>
/// The user has placed the cursor over the child window and has clicked the left mouse button. HIWORD( <c>wParam</c>) is
/// undefined. <c>lParam</c> is the x-coordinate of the cursor is the low-order word, and the y-coordinate of the cursor is the
/// high-order word.
/// </term>
/// </item>
/// <item>
/// <term><c>WM_MBUTTONDOWN</c> 0x0207</term>
/// <term>
/// The user has placed the cursor over the child window and has clicked the middle mouse button. HIWORD( <c>wParam</c>) is
/// undefined. <c>lParam</c> is the x-coordinate of the cursor is the low-order word, and the y-coordinate of the cursor is the
/// high-order word.
/// </term>
/// </item>
/// <item>
/// <term><c>WM_RBUTTONDOWN</c> 0x0204</term>
/// <term>
/// The user has placed the cursor over the child window and has clicked the right mouse button. HIWORD( <c>wParam</c>) is
/// undefined. <c>lParam</c> is the x-coordinate of the cursor is the low-order word, and the y-coordinate of the cursor is the
/// high-order word.
/// </term>
/// </item>
/// <item>
/// <term><c>WM_XBUTTONDOWN</c> 0x020B</term>
/// <term>
/// The user has placed the cursor over the child window and has clicked the first or second X button. HIWORD( <c>wParam</c>)
/// indicates which button was pressed. This parameter can be one of the following values: XBUTTON1 or XBUTTON2. <c>lParam</c> is
/// the x-coordinate of the cursor is the low-order word, and the y-coordinate of the cursor is the high-order word.
/// </term>
/// </item>
/// <item>
/// <term><c>WM_POINTERDOWN</c> 0x0246</term>
/// <term>
/// A pointer has made contact with the child window. HIWORD( <c>wParam</c>) contains the identifier of the pointer that
/// generated the <c>WM_POINTERDOWN</c> event.
/// </term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>Contains the point location of the pointer.</para>
/// <para>
/// <para>Note</para>
/// <para>
/// Because the pointer may make contact with the device over a non-trivial area, this point location may be a simplification of
/// a more complex pointer area. Whenever possible, an application should use the complete pointer area information instead of
/// the point location.
/// </para>
/// </para>
/// <para>Use the following macros to retrieve the physical screen coordinates of the point.</para>
/// <list type="bullet">
/// <item>
/// <term><c>GET_X_LPARAM</c>(lParam): the x (horizontal point) coordinate.</term>
/// </item>
/// <item>
/// <term><c>GET_Y_LPARAM</c>(lParam): the y (vertical point) coordinate.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>If the application processes this message, it returns zero.</para>
/// <para>If the application does not process this message, it calls <c>DefWindowProc</c>.</para>
/// <remarks>
/// <para>This message is also sent to all ancestor windows of the child window, including the top-level window.</para>
/// <para>
/// All child windows, except those that have the <c>WS_EX_NOPARENTNOTIFY</c> extended window style, send this message to their
/// parent windows. By default, child windows in a dialog box have the <c>WS_EX_NOPARENTNOTIFY</c> style, unless the
/// <c>CreateWindowEx</c> function is called to create the child window without this style.
/// </para>
/// <para>
/// This notification provides the child window's ancestor windows an opportunity to examine the pointer information and, if
/// required, capture the pointer using the pointer capture functions.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputmsg/wm-parentnotify
WM_PARENTNOTIFY = 0x0210,
/// <summary>
/// <para>Notifies an application's main window procedure that a menu modal loop has been entered.</para>
/// <para>
/// <code>#define WM_ENTERMENULOOP 0x0211</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Specifies whether the window menu was entered using the <c>TrackPopupMenu</c> function. This parameter has a value of
/// <c>TRUE</c> if the window menu was entered using <c>TrackPopupMenu</c>, and <c>FALSE</c> if it was not.
/// </para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>The <c>DefWindowProc</c> function returns zero.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-entermenuloop
WM_ENTERMENULOOP = 0x0211,
/// <summary>
/// <para>Notifies an application's main window procedure that a menu modal loop has been exited.</para>
/// <para>
/// <code>#define WM_EXITMENULOOP 0x0212</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Specifies whether the menu is a shortcut menu. This parameter has a value of <c>TRUE</c> if it is a shortcut menu,
/// <c>FALSE</c> if it is not.
/// </para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>The <c>DefWindowProc</c> function returns zero.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-exitmenuloop
WM_EXITMENULOOP = 0x0212,
/// <summary>
/// <para>Sent to an application when the right or left arrow key is used to switch between the menu bar and the system menu.</para>
/// <para>
/// <code>#define WM_NEXTMENU 0x0213</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The virtual-key code of the key. See <c>Virtual-Key Codes</c>.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to a <c>MDINEXTMENU</c> structure that contains information about the menu to be activated.</para>
/// <remarks>
/// In responding to this message, the application can specify the menu to switch to in the <c>hmenuNext</c> member of
/// <c>MDINEXTMENU</c> and the window to receive the menu notification messages in the <c>hwndNext</c> member of the
/// <c>MDINEXTMENU</c> structure. You must set both members for the changes to take effect (they are initially <c>NULL</c>).
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-nextmenu
WM_NEXTMENU = 0x0213,
/// <summary>
/// <para>
/// Sent to a window that the user is resizing. By processing this message, an application can monitor the size and position of
/// the drag rectangle and, if needed, change its size or position.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_SIZING 0x0214</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The edge of the window that is being sized. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>WMSZ_BOTTOM</c> 6</term>
/// <term>Bottom edge</term>
/// </item>
/// <item>
/// <term><c>WMSZ_BOTTOMLEFT</c> 7</term>
/// <term>Bottom-left corner</term>
/// </item>
/// <item>
/// <term><c>WMSZ_BOTTOMRIGHT</c> 8</term>
/// <term>Bottom-right corner</term>
/// </item>
/// <item>
/// <term><c>WMSZ_LEFT</c> 1</term>
/// <term>Left edge</term>
/// </item>
/// <item>
/// <term><c>WMSZ_RIGHT</c> 2</term>
/// <term>Right edge</term>
/// </item>
/// <item>
/// <term><c>WMSZ_TOP</c> 3</term>
/// <term>Top edge</term>
/// </item>
/// <item>
/// <term><c>WMSZ_TOPLEFT</c> 4</term>
/// <term>Top-left corner</term>
/// </item>
/// <item>
/// <term><c>WMSZ_TOPRIGHT</c> 5</term>
/// <term>Top-right corner</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>RECT</c> structure with the screen coordinates of the drag rectangle. To change the size or position of the
/// drag rectangle, an application must change the members of this structure.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return <c>TRUE</c> if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-sizing
WM_SIZING = 0x0214,
/// <summary>
/// <para>Sent to the window that is losing the mouse capture.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_CAPTURECHANGED 0x0215</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the window gaining the mouse capture.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// A window receives this message even if it calls <c>ReleaseCapture</c> itself. An application should not attempt to set the
/// mouse capture in response to this message.
/// </para>
/// <para>When it receives this message, a window should redraw itself, if necessary, to reflect the new mouse-capture state.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-capturechanged
WM_CAPTURECHANGED = 0x0215,
/// <summary>
/// <para>
/// Sent to a window that the user is moving. By processing this message, an application can monitor the position of the drag
/// rectangle and, if needed, change its position.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOVING 0x0216</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>RECT</c> structure with the current position of the window, in screen coordinates. To change the position
/// of the drag rectangle, an application must change the members of this structure.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return <c>TRUE</c> if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-moving
WM_MOVING = 0x0216,
/// <summary>
/// <para>Notifies applications that a power-management event has occurred.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // WM_POWERBROADCAST WPARAM wParam, // power-management event LPARAM lParam // function-specific data );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>*uMsg*</em></para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c><c>WM_POWERBROADCAST</c></c> 536 (0x218)</term>
/// <term>Message identifier.</term>
/// </item>
/// </list>
/// <para><em>wParam</em></para>
/// <para>The power-management event. This parameter can be one of the following event identifiers.</para>
/// <list type="table">
/// <listheader>
/// <term>Event</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>PBT_APMPOWERSTATUSCHANGE</c> 10 (0xA)</term>
/// <term>Power status has changed.</term>
/// </item>
/// <item>
/// <term><c>PBT_APMRESUMEAUTOMATIC</c> 18 (0x12)</term>
/// <term>Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.</term>
/// </item>
/// <item>
/// <term><c>PBT_APMRESUMESUSPEND</c> 7 (0x7)</term>
/// <term>
/// Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by
/// user input, such as pressing a key.
/// </term>
/// </item>
/// <item>
/// <term><c>PBT_APMSUSPEND</c> 4 (0x4)</term>
/// <term>System is suspending operation.</term>
/// </item>
/// <item>
/// <term><c>PBT_POWERSETTINGCHANGE</c> 32787 (0x8013)</term>
/// <term>A power setting change event has been received.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>The event-specific data. For most events, this parameter is reserved and not used.</para>
/// <para>
/// If the wParam parameter is PBT_POWERSETTINGCHANGE, the lParam parameter is a pointer to a <c>POWERBROADCAST_SETTING</c> structure.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return <c>TRUE</c> if it processes this message.</para>
/// <remarks>
/// <para>
/// The system always sends a PBT_APMRESUMEAUTOMATIC message whenever the system resumes. If the system resumes in response to
/// user input such as pressing a key, the system also sends a <c>PBT_APMRESUMESUSPEND</c> message after sending PBT_APMRESUMEAUTOMATIC.
/// </para>
/// <para>
/// <c>WM_POWERBROADCAST</c> messages do not distinguish between different low-power states. An application can determine only
/// that the system is entering or has resumed from a low-power state; it cannot determine the specific power state. The system
/// records details about power state transitions in the Windows System event log.
/// </para>
/// <para>
/// To prevent the system from transitioning to a low-power state in Windows Vista, an application must call
/// <c>SetThreadExecutionState</c> to inform the system that it is in use.
/// </para>
/// <para>The following messages are not supported on any of the operating systems specified in the Requirements section:</para>
/// <list type="bullet">
/// <item>
/// <term>PBT_APMQUERYSTANDBY</term>
/// </item>
/// <item>
/// <term>PBT_APMQUERYSTANDBYFAILED</term>
/// </item>
/// <item>
/// <term>PBT_APMSTANDBY</term>
/// </item>
/// <item>
/// <term>PBT_APMRESUMESTANDBY</term>
/// </item>
/// </list>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/power/wm-powerbroadcast
WM_POWERBROADCAST = 0x0218,
/// <summary>
/// <para>Notifies an application of a change to the hardware configuration of a device or the computer.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc(HWND hwnd, // handle to window UINT uMsg, // WM_DEVICECHANGE WPARAM wParam, // device-change event LPARAM lParam ); // event-specific data</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to the window.</para>
/// <para><em>uMsg</em></para>
/// <para>The <c>WM_DEVICECHANGE</c> identifier.</para>
/// <para><em>wParam</em></para>
/// <para>The event that has occurred. This parameter can be one of the following values from the Dbt.h header file.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>DBT_DEVNODES_CHANGED</c> 0x0007</term>
/// <term>A device has been added to or removed from the system.</term>
/// </item>
/// <item>
/// <term><c>DBT_QUERYCHANGECONFIG</c> 0x0017</term>
/// <term>Permission is requested to change the current configuration (dock or undock).</term>
/// </item>
/// <item>
/// <term><c>DBT_CONFIGCHANGED</c> 0x0018</term>
/// <term>The current configuration has changed, due to a dock or undock.</term>
/// </item>
/// <item>
/// <term><c>DBT_CONFIGCHANGECANCELED</c> 0x0019</term>
/// <term>A request to change the current configuration (dock or undock) has been canceled.</term>
/// </item>
/// <item>
/// <term><c>DBT_DEVICEARRIVAL</c> 0x8000</term>
/// <term>A device or piece of media has been inserted and is now available.</term>
/// </item>
/// <item>
/// <term><c>DBT_DEVICEQUERYREMOVE</c> 0x8001</term>
/// <term>
/// Permission is requested to remove a device or piece of media. Any application can deny this request and cancel the removal.
/// </term>
/// </item>
/// <item>
/// <term><c>DBT_DEVICEQUERYREMOVEFAILED</c> 0x8002</term>
/// <term>A request to remove a device or piece of media has been canceled.</term>
/// </item>
/// <item>
/// <term><c>DBT_DEVICEREMOVEPENDING</c> 0x8003</term>
/// <term>A device or piece of media is about to be removed. Cannot be denied.</term>
/// </item>
/// <item>
/// <term><c>DBT_DEVICEREMOVECOMPLETE</c> 0x8004</term>
/// <term>A device or piece of media has been removed.</term>
/// </item>
/// <item>
/// <term><c>DBT_DEVICETYPESPECIFIC</c> 0x8005</term>
/// <term>A device-specific event has occurred.</term>
/// </item>
/// <item>
/// <term><c>DBT_CUSTOMEVENT</c> 0x8006</term>
/// <term>A custom event has occurred.</term>
/// </item>
/// <item>
/// <term><c>DBT_USERDEFINED</c> 0xFFFF</term>
/// <term>The meaning of this message is user-defined.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a structure that contains event-specific data. Its format depends on the value of the wParam parameter. For more
/// information, refer to the documentation for each event.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Return <c>TRUE</c> to grant the request.</para>
/// <para>Return <c>BROADCAST_QUERY_DENY</c> to deny the request.</para>
/// <remarks>
/// For devices that offer software-controllable features, such as ejection and locking, the system typically sends a
/// DBT_DEVICEREMOVEPENDING message to let applications and device drivers end their use of the device gracefully. If the system
/// forcibly removes a device, it may not send a DBT_DEVICEQUERYREMOVE message before doing so.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/devio/wm-devicechange
WM_DEVICECHANGE = 0x0219,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDICREATE</c> message to a multiple-document interface (MDI) client window to create an MDI
/// child window.
/// </para>
/// <para>
/// <code>#define WM_MDICREATE 0x0220</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to an <c>MDICREATESTRUCT</c> structure containing information that the system uses to create the MDI child window.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>HWND</c></para>
/// <para>If the message succeeds, the return value is the handle to the new child window.</para>
/// <para>If the message fails, the return value is <c>NULL</c>.</para>
/// <remarks>
/// <para>
/// The MDI child window is created with the <c>window style</c> bits <c>WS_CHILD</c>, <c>WS_CLIPSIBLINGS</c>,
/// <c>WS_CLIPCHILDREN</c>, <c>WS_SYSMENU</c>, <c>WS_CAPTION</c>, <c>WS_THICKFRAME</c>, <c>WS_MINIMIZEBOX</c>, and
/// <c>WS_MAXIMIZEBOX</c>, plus additional style bits specified in the <c>MDICREATESTRUCT</c> structure. The system adds the
/// title of the new child window to the window menu of the frame window. An application should use this message to create all
/// child windows of the client window.
/// </para>
/// <para>
/// If an MDI client window receives any message that changes the activation of its child windows while the active child window
/// is maximized, the system restores the active child window and maximizes the newly activated child window.
/// </para>
/// <para>
/// When an MDI child window is created, the system sends the <c>WM_CREATE</c> message to the window. The lParam parameter of the
/// <c>WM_CREATE</c> message contains a pointer to a <c>CREATESTRUCT</c> structure. The lpCreateParams member of this structure
/// contains a pointer to the <c>MDICREATESTRUCT</c> structure passed with the <c>WM_MDICREATE</c> message that created the MDI
/// child window.
/// </para>
/// <para>
/// An application should not send a second <c>WM_MDICREATE</c> message while a <c>WM_MDICREATE</c> message is still being
/// processed. For example, it should not send a <c>WM_MDICREATE</c> message while an MDI child window is processing its
/// <c>WM_MDICREATE</c> message.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdicreate
WM_MDICREATE = 0x0220,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIDESTROY</c> message to a multiple-document interface (MDI) client window to close an MDI
/// child window.
/// </para>
/// <para>
/// <code>#define WM_MDIDESTROY 0x0221</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the MDI child window to be closed.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>zero</c></para>
/// <para>This message always returns zero.</para>
/// <remarks>
/// <para>
/// This message removes the title of the MDI child window from the MDI frame window and deactivates the child window. An
/// application should use this message to close all MDI child windows.
/// </para>
/// <para>
/// If an MDI client window receives a message that changes the activation of its child windows and the active MDI child window
/// is maximized, the system restores the active child window and maximizes the newly activated child window.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdidestroy
WM_MDIDESTROY = 0x0221,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIACTIVATE</c> message to a multiple-document interface (MDI) client window to instruct the
/// client window to activate a different MDI child window.
/// </para>
/// <para>
/// <code>#define WM_MDIACTIVATE 0x0222</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the MDI child window to be activated.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application sends this message to an MDI client window, the return value is zero.</para>
/// <para>An MDI child window should return zero if it processes this message.</para>
/// <remarks>
/// <para>
/// As the client window processes this message, it sends <c>WM_MDIACTIVATE</c> to the child window being deactivated and to the
/// child window being activated. The message parameters received by an MDI child window are as follows:
/// </para>
/// <list>
/// <item>
/// <term>
/// <para>wParam</para>
/// </term>
/// <term>
/// <para>lParam</para>
/// </term>
/// </item>
/// </list>
/// <para>
/// An MDI child window is activated independently of the MDI frame window. When the frame window becomes active, the child
/// window last activated by using the <c>WM_MDIACTIVATE</c> message receives the <c>WM_NCACTIVATE</c> message to draw an active
/// window frame and title bar; the child window does not receive another <c>WM_MDIACTIVATE</c> message.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdiactivate
WM_MDIACTIVATE = 0x0222,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIRESTORE</c> message to a multiple-document interface (MDI) client window to restore an MDI
/// child window from maximized or minimized size.
/// </para>
/// <para>
/// <code>#define WM_MDIRESTORE 0x0223</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the MDI child window to be restored.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>zero</c></para>
/// <para>The return value is always zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdirestore
WM_MDIRESTORE = 0x0223,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDINEXT</c> message to a multiple-document interface (MDI) client window to activate the next
/// or previous child window.
/// </para>
/// <para>
/// <code>#define WM_MDINEXT 0x0224</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// A handle to the MDI child window. The system activates the child window that is immediately before or after the specified
/// child window, depending on the value of the lParam parameter. If the wParam parameter is <c>NULL</c>, the system activates
/// the child window that is immediately before or after the currently active child window.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// If this parameter is zero, the system activates the next MDI child window and places the child window identified by the
/// wParam parameter behind all other child windows. If this parameter is nonzero, the system activates the previous child
/// window, placing it in front of the child window identified by wParam.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>zero</c></para>
/// <para>The return value is always zero.</para>
/// <remarks>
/// If an MDI client window receives any message that changes the activation of its child windows while the active MDI child
/// window is maximized, the system restores the active child window and maximizes the newly activated child window.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdinext
WM_MDINEXT = 0x0224,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIMAXIMIZE</c> message to a multiple-document interface (MDI) client window to maximize an
/// MDI child window. The system resizes the child window to make its client area fill the client window. The system places the
/// child window's window menu icon in the rightmost position of the frame window's menu bar, and places the child window's
/// restore icon in the leftmost position. The system also appends the title bar text of the child window to that of the frame window.
/// </para>
/// <para>
/// <code>#define WM_MDIMAXIMIZE 0x0225</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the MDI child window to be maximized.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>zero</c></para>
/// <para>The return value is always zero.</para>
/// <remarks>
/// If an MDI client window receives any message that changes the activation of its child windows while the currently active MDI
/// child window is maximized, the system restores the active child window and maximizes the newly activated child window.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdimaximize
WM_MDIMAXIMIZE = 0x0225,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDITILE</c> message to a multiple-document interface (MDI) client window to arrange all of its
/// MDI child windows in a tile format.
/// </para>
/// <para>
/// <code>#define WM_MDITILE 0x0226</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The tiling option. This parameter can be one of the following values, optionally combined with <c>MDITILE_SKIPDISABLED</c> to
/// prevent disabled MDI child windows from being tiled.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MDITILE_HORIZONTAL</c> 0x0001</term>
/// <term>Tiles windows horizontally.</term>
/// </item>
/// <item>
/// <term><c>MDITILE_VERTICAL</c> 0x0000</term>
/// <term>Tiles windows vertically.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>BOOL</c></para>
/// <para>If the message succeeds, the return value is <c>TRUE</c>.</para>
/// <para>If the message fails, the return value is <c>FALSE</c>.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mditile
WM_MDITILE = 0x0226,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDICASCADE</c> message to a multiple-document interface (MDI) client window to arrange all its
/// child windows in a cascade format.
/// </para>
/// <para>
/// <code>#define WM_MDICASCADE 0x0227</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The cascade behavior. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MDITILE_SKIPDISABLED</c> 0x0002</term>
/// <term>Prevents disabled MDI child windows from being cascaded.</term>
/// </item>
/// <item>
/// <term><c>MDITILE_ZORDER</c> 0x0004</term>
/// <term>Arranges the windows in Z order.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>BOOL</c></para>
/// <para>If the message succeeds, the return value is <c>TRUE</c>.</para>
/// <para>If the message fails, the return value is <c>FALSE</c>.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdicascade
WM_MDICASCADE = 0x0227,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIICONARRANGE</c> message to a multiple-document interface (MDI) client window to arrange all
/// minimized MDI child windows. It does not affect child windows that are not minimized.
/// </para>
/// <para>
/// <code>#define WM_MDIICONARRANGE 0x0228</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used; it must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used; it must be zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdiiconarrange
WM_MDIICONARRANGE = 0x0228,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIGETACTIVE</c> message to a multiple-document interface (MDI) client window to retrieve the
/// handle to the active MDI child window.
/// </para>
/// <para>
/// <code>#define WM_MDIGETACTIVE 0x0229</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The maximized state. If this parameter is not <c>NULL</c>, it is a pointer to a value that indicates the maximized state of
/// the MDI child window. If the value is <c>TRUE</c>, the window is maximized; a value of <c>FALSE</c> indicates that it is not.
/// If this parameter is <c>NULL</c>, the parameter is ignored.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>HWND</c></para>
/// <para>The return value is the handle to the active MDI child window.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdigetactive
WM_MDIGETACTIVE = 0x0229,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDISETMENU</c> message to a multiple-document interface (MDI) client window to replace the
/// entire menu of an MDI frame window, to replace the window menu of the frame window, or both.
/// </para>
/// <para>
/// <code>#define WM_MDISETMENU 0x0230</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the new frame window menu. If this parameter is <c>NULL</c>, the frame window menu is not changed.</para>
/// <para><em>lParam</em></para>
/// <para>A handle to the new window menu. If this parameter is <c>NULL</c>, the window menu is not changed.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>HMENU</c></para>
/// <para>If the message succeeds, the return value is the handle to the old frame window menu.</para>
/// <para>If the message fails, the return value is zero.</para>
/// <remarks>
/// <para>After sending this message, an application must call the <c>DrawMenuBar</c> function to update the menu bar.</para>
/// <para>
/// If this message replaces the window menu, the MDI child window menu items are removed from the previous window menu and added
/// to the new window menu.
/// </para>
/// <para>
/// If an MDI child window is maximized and this message replaces the MDI frame window menu, the window menu icon and restore
/// icon are removed from the previous frame window menu and added to the new frame window menu.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdisetmenu
WM_MDISETMENU = 0x0230,
/// <summary>
/// <para>
/// Sent one time to a window after it enters the moving or sizing modal loop. The window enters the moving or sizing modal loop
/// when the user clicks the window's title bar or sizing border, or when the window passes the <c>WM_SYSCOMMAND</c> message to
/// the <c>DefWindowProc</c> function and the wParam parameter of the message specifies the <c>SC_MOVE</c> or <c>SC_SIZE</c>
/// value. The operation is complete when <c>DefWindowProc</c> returns.
/// </para>
/// <para>The system sends the <c>WM_ENTERSIZEMOVE</c> message regardless of whether the dragging of full windows is enabled.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_ENTERSIZEMOVE 0x0231</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return zero if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-entersizemove
WM_ENTERSIZEMOVE = 0x0231,
/// <summary>
/// <para>
/// Sent one time to a window, after it has exited the moving or sizing modal loop. The window enters the moving or sizing modal
/// loop when the user clicks the window's title bar or sizing border, or when the window passes the <c>WM_SYSCOMMAND</c> message
/// to the <c>DefWindowProc</c> function and the wParam parameter of the message specifies the <c>SC_MOV</c> E or <c>SC_SIZE</c>
/// value. The operation is complete when <c>DefWindowProc</c> returns.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_EXITSIZEMOVE 0x0232</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>An application should return zero if it processes this message.</para>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-exitsizemove
WM_EXITSIZEMOVE = 0x0232,
/// <summary>
/// <para>
/// Sent when the user drops a file on the window of an application that has registered itself as a recipient of dropped files.
/// </para>
/// <para>
/// <code>PostMessage( (HWND) hWndControl, // handle to destination control (UINT) WM_DROPFILES, // message ID (WPARAM) wParam, // = (WPARAM) (HDROP) hDrop; (LPARAM) lParam // = 0; not used, must be zero );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hDrop</em></para>
/// <para>
/// A handle to an internal structure describing the dropped files. Pass this handle <c>DragFinish</c>, <c>DragQueryFile</c>, or
/// <c>DragQueryPoint</c> to retrieve information about the dropped files.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>An application should return zero if it processes this message.</para>
/// <remarks>
/// The HDROP handle is declared in Shellapi.h. You must include this header in your build to use <c>WM_DROPFILES</c>. For
/// further discussion of how to use drag-and-drop to transfer Shell data, see Transferring Shell Data Using Drag-and-Drop or the Clipboard.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/shell/wm-dropfiles
WM_DROPFILES = 0x0233,
/// <summary>
/// <para>
/// An application sends the <c>WM_MDIREFRESHMENU</c> message to a multiple-document interface (MDI) client window to refresh the
/// window menu of the MDI frame window.
/// </para>
/// <para>
/// <code>#define WM_MDIREFRESHMENU 0x0234</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>HMENU</c></para>
/// <para>If the message succeeds, the return value is the handle to the frame window menu.</para>
/// <para>If the message fails, the return value is <c>NULL</c>.</para>
/// <remarks>After sending this message, an application must call the <c>DrawMenuBar</c> function to update the menu bar.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-mdirefreshmenu
WM_MDIREFRESHMENU = 0x0234,
/// <summary>
/// <para>Sent to an application when a window is activated. A window receives this message through its WindowProc function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_SETCONTEXT, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para><c>TRUE</c> if the window is active, and <c>FALSE</c> otherwise.</para>
/// <para><em>lParam</em></para>
/// <para>Display options. This parameter can have one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>ISC_SHOWUICOMPOSITIONWINDOW</c></term>
/// <term>Show the composition window by user interface window.</term>
/// </item>
/// <item>
/// <term><c>ISC_SHOWUIGUIDWINDOW</c></term>
/// <term>Show the guide window by user interface window.</term>
/// </item>
/// <item>
/// <term><c>ISC_SHOWUISOFTKBD</c></term>
/// <term>Show the soft keyboard by user interface window.</term>
/// </item>
/// <item>
/// <term><c>ISC_SHOWUICANDIDATEWINDOW</c></term>
/// <term>Show the candidate window of index 0 by user interface window.</term>
/// </item>
/// <item>
/// <term>ISC_SHOWUICANDIDATEWINDOW &lt;&lt; 1</term>
/// <term>Show the candidate window of index 1 by user interface window.</term>
/// </item>
/// <item>
/// <term>ISC_SHOWUICANDIDATEWINDOW &lt;&lt; 2</term>
/// <term>Show the candidate window of index 2 by user interface window.</term>
/// </item>
/// <item>
/// <term>ISC_SHOWUICANDIDATEWINDOW &lt;&lt; 3</term>
/// <term>Show the candidate window of index 3 by user interface window.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>Returns the value returned by <c>DefWindowProc</c> or <c>ImmIsUIMessage</c>.</para>
/// <remarks>
/// <para>
/// If the application has created an IME window, it should call <c>ImmIsUIMessage</c>. Otherwise, it should pass this message to <c>DefWindowProc</c>.
/// </para>
/// <para>
/// If the application draws the composition window, the default IME window does not have to show its composition window. In this
/// case, the application must clear the <c>ISC_SHOWUICOMPOSITIONWINDOW</c> value from the lParam parameter before passing the
/// message to <c>DefWindowProc</c> or <c>ImmIsUIMessage</c>. To display a certain user interface window, an application should
/// remove the corresponding value so that the IME will not display it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-setcontext
WM_IME_SETCONTEXT = 0x0281,
/// <summary>
/// <para>
/// Sent to an application to notify it of changes to the IME window. A window receives this message through its
/// <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_NOTIFY, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>The command. This parameter can have one of the following values.</para>
/// <list/>
/// <para><em>lParam</em></para>
/// <para>
/// Command-specific data, with format dependent on the value of the wParam parameter. For more information, refer to the
/// documentation for each command.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>The return value depends on the command sent.</para>
/// <remarks>An application processes this message if it is responsible for managing the IME window.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-notify
WM_IME_NOTIFY = 0x0282,
/// <summary>
/// <para>
/// Sent by an application to direct the IME window to carry out the requested command. The application uses this message to
/// control the IME window that it has created. To send this message, the application calls the <c>SendMessage</c> function with
/// the following parameters.
/// </para>
/// <para>
/// <code>SendMessage( HWND hwnd, WM_IME_CONTROL, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>Handle to the window.</para>
/// <para><em>wParam</em></para>
/// <para>The command. This parameter can have one of the following values:</para>
/// <list/>
/// <para><em>lParam</em></para>
/// <para>
/// Command-specific data, with format dependent on the value of the wParam parameter. For more information, refer to the
/// documentation for each command.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>The message returns a command-specific value.</para>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-control
WM_IME_CONTROL = 0x0283,
/// <summary>
/// <para>
/// Sent to an application when the IME window finds no space to extend the area for the composition window. A window receives
/// this message through its <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_COMPOSITIONFULL, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><strong>Returns</strong></para>
/// <para>This message has no return value.</para>
/// <remarks>
/// <para>The application should use the IMC_SETCOMPOSITIONWINDOW command to specify how the window should be displayed.</para>
/// <para>The IME window, instead of the IME, sends this notification message by the <c>SendMessage</c> function.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-compositionfull
WM_IME_COMPOSITIONFULL = 0x0284,
/// <summary>
/// <para>
/// Sent to an application when the operating system is about to change the current IME. A window receives this message through
/// its WindowProc function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_SELECT, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>
/// Selection indicator. This parameter specifies <c>TRUE</c> if the indicated IME is selected. The parameter is set to
/// <c>FALSE</c> if the specified IME is no longer selected.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Input locale identifier associated with the IME.</para>
/// <para><strong>Returns</strong></para>
/// <para>This message has no return value.</para>
/// <remarks>
/// <para>
/// An application that has created an IME window should pass this message to that window so that it can retrieve the keyboard
/// layout handle to the newly selected IME.
/// </para>
/// <para>The <c>DefWindowProc</c> function processes this message by passing the information to the default IME window.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-select
WM_IME_SELECT = 0x0285,
/// <summary>
/// <para>
/// Sent to an application when the IME gets a character of the conversion result. A window receives this message through its
/// <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_CHAR, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>
/// <c>DBCS:</c> A single-byte or double-byte character value. For a double-byte character, (BYTE)(wParam &gt;&gt; 8) contains
/// the lead byte. Note that the parentheses are necessary because the cast operator has higher precedence than the shift operator.
/// </para>
/// <para><c>Unicode:</c> A Unicode character value.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The repeat count, scan code, extended key flag, context code, previous key state flag, and transition state flag, with values
/// as defined below.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bit</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>Repeat count. Since the first byte and second byte are continuous, this is always 1.</term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>Scan code for a complete Asian character.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>Extended key.</term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Not used.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>Context code.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>Previous key state.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>Transition state.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// Unlike the <c>WM_CHAR</c> message for a non-Unicode window, this message can include double-byte and single-byte character
/// values. For a Unicode window, this message is the same as WM_CHAR.
/// </para>
/// <para>
/// For a non-Unicode window, if the WM_IME_CHAR message includes a double-byte character and the application passes this message
/// to <c>DefWindowProc</c>, the IME converts this message into two WM_CHAR messages, each containing one byte of the double-byte character.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-char
WM_IME_CHAR = 0x0286,
/// <summary>
/// <para>
/// Sent to an application to provide commands and request information. A window receives this message through its
/// <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_REQUEST, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>Command. This parameter can have one of the following values:</para>
/// <list/>
/// <para><em>lParam</em></para>
/// <para>Command-specific data. For more information, see the description for each command.</para>
/// <para><strong>Returns</strong></para>
/// <para>Returns a command-specific value.</para>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-request
WM_IME_REQUEST = 0x0288,
/// <summary>
/// <para>
/// Sent to an application by the IME to notify the application of a key press and to keep message order. A window receives this
/// message through its <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_KEYDOWN, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>Virtual key code of the key.</para>
/// <para><em>lParam</em></para>
/// <para>
/// Repeat count, scan code, extended key flag, context code, previous key state flag, and transition state flag, as shown in the
/// following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bit</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>Repeat count.</term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>Scan code.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>Extended key. This value is 1 if it is an extended key. Otherwise, it is 0.</term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Not used.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>Context code. This value is always 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>Previous key state. This value is 1 if the key is down or 0 if it is up.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>Transition state. This value is always 0.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>An application should return 0 if it processes this message.</para>
/// <remarks>
/// An application can process this message or pass it to the <c>DefWindowProc</c> function to generate a matching
/// <c>WM_KEYDOWN</c> message.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-keydown
WM_IME_KEYDOWN = 0x0290,
/// <summary>
/// <para>
/// Sent to an application by the IME to notify the application of a key release and to keep message order. A window receives
/// this message through its <c>WindowProc</c> function.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, WM_IME_KEYUP, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hwnd</em></para>
/// <para>A handle to window.</para>
/// <para><em>wParam</em></para>
/// <para>Virtual key code of the key.</para>
/// <para><em>lParam</em></para>
/// <para>
/// Repeat count, scan code, extended key flag, context code, previous key state flag, and transition state flag, as shown below.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bit</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0-15</term>
/// <term>Repeat count. This value is always 1.</term>
/// </item>
/// <item>
/// <term>16-23</term>
/// <term>Scan code.</term>
/// </item>
/// <item>
/// <term>24</term>
/// <term>Extended key. This value is 1 if it is an extended key. Otherwise, it is 0.</term>
/// </item>
/// <item>
/// <term>25-28</term>
/// <term>Not used.</term>
/// </item>
/// <item>
/// <term>29</term>
/// <term>Context code. This value is always 0.</term>
/// </item>
/// <item>
/// <term>30</term>
/// <term>Previous key state. This value is always 1.</term>
/// </item>
/// <item>
/// <term>31</term>
/// <term>Transition state. This value is always 1.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>An application should return 0 if it processes this message.</para>
/// <remarks>
/// An application can process this message or pass it to the <c>DefWindowProc</c> function to generate a matching
/// <c>WM_KEYUP</c> message.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/intl/wm-ime-keyup
WM_IME_KEYUP = 0x0291,
/// <summary>
/// <para>
/// Posted to a window when the cursor hovers over the client area of the window for the period of time specified in a prior call
/// to <c>TrackMouseEvent</c>.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOUSEHOVER 0x02A1</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Indicates whether various virtual keys are down. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is depressed.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is depressed.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is depressed.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is depressed.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is depressed.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para>
/// The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the
/// client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// Hover tracking stops when <c>WM_MOUSEHOVER</c> is generated. The application must call <c>TrackMouseEvent</c> again if it
/// requires further tracking of mouse hover behavior.
/// </para>
/// <para>Use the following code to obtain the horizontal and vertical position:</para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// As noted above, the x-coordinate is in the low-order <c>short</c> of the return value; the y-coordinate is in the high-order
/// <c>short</c> (both represent signed values because they can take negative values on systems with multiple monitors). If the
/// return value is assigned to a variable, you can use the <c>MAKEPOINTS</c> macro to obtain a <c>POINTS</c> structure from the
/// return value. You can also use the <c>GET_X_LPARAM</c> or <c>GET_Y_LPARAM</c> macro to extract the x- or y-coordinate.
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousehover
WM_MOUSEHOVER = 0x02A1,
/// <summary>
/// <para>Posted to a window when the cursor leaves the client area of the window specified in a prior call to <c>TrackMouseEvent</c>.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_MOUSELEAVE 0x02A3</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// All tracking requested by <c>TrackMouseEvent</c> is canceled when this message is generated. The application must call
/// <c>TrackMouseEvent</c> when the mouse reenters its window if it requires further tracking of mouse hover behavior.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mouseleave
WM_MOUSELEAVE = 0x02A3,
/// <summary>
/// <para>
/// Posted to a window when the cursor hovers over the nonclient area of the window for the period of time specified in a prior
/// call to <c>TrackMouseEvent</c>.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCMOUSEHOVER 0x02A0</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The hit-test value returned by the <c>DefWindowProc</c> function as a result of processing the <c>WM_NCHITTEST</c> message.
/// For a list of hit-test values, see <c>WM_NCHITTEST</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A <c>POINTS</c> structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the
/// upper-left corner of the screen.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// Hover tracking stops when this message is generated. The application must call <c>TrackMouseEvent</c> again if it requires
/// further tracking of mouse hover behavior.
/// </para>
/// <para>
/// You can also use the <c>GET_X_LPARAM</c> and <c>GET_Y_LPARAM</c> macros to extract the values of the x- and y- coordinates
/// from lParam.
/// </para>
/// <para>
/// <code>xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);</code>
/// </para>
/// <para>
/// <para>Important</para>
/// <para>
/// Do not use the <c>LOWORD</c> or <c>HIWORD</c> macros to extract the x- and y- coordinates of the cursor position because
/// these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x-
/// and y- coordinates, and <c>LOWORD</c> and <c>HIWORD</c> treat the coordinates as unsigned quantities.
/// </para>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncmousehover
WM_NCMOUSEHOVER = 0x02A0,
/// <summary>
/// <para>Posted to a window when the cursor leaves the nonclient area of the window specified in a prior call to <c>TrackMouseEvent</c>.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_NCMOUSELEAVE 0x02A2</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// All tracking requested by <c>TrackMouseEvent</c> is canceled when this message is generated. The application must call
/// <c>TrackMouseEvent</c> when the mouse reenters its window if it requires further tracking of mouse hover behavior.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-ncmouseleave
WM_NCMOUSELEAVE = 0x02A2,
/// <summary>
/// <para>Notifies applications of changes in session state.</para>
/// <para>The window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hWnd, // handle to window UINT Msg, // WM_WTSSESSION_CHANGE WPARAM wParam, // session state change event LPARAM lParam // session ID );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>hWnd</em></para>
/// <para>Handle to the window.</para>
/// <para><em>Msg</em></para>
/// <para>Specifies the message ( <c>WM_WTSSESSION_CHANGE</c>).</para>
/// <para><em>wParam</em></para>
/// <para>
/// Status code describing the reason the session state change notification was sent. This parameter can be one of the following values.
/// </para>
/// <para><em><c>WTS_CONSOLE_CONNECT</c> (0x1)</em></para>
/// <para>The session identified by lParam was connected to the console terminal or RemoteFX session.</para>
/// <para><em><c>WTS_CONSOLE_DISCONNECT</c> (0x2)</em></para>
/// <para>The session identified by lParam was disconnected from the console terminal or RemoteFX session.</para>
/// <para><em><c>WTS_REMOTE_CONNECT</c> (0x3)</em></para>
/// <para>The session identified by lParam was connected to the remote terminal.</para>
/// <para><em><c>WTS_REMOTE_DISCONNECT</c> (0x4)</em></para>
/// <para>The session identified by lParam was disconnected from the remote terminal.</para>
/// <para><em><c>WTS_SESSION_LOGON</c> (0x5)</em></para>
/// <para>A user has logged on to the session identified by lParam.</para>
/// <para><em><c>WTS_SESSION_LOGOFF</c> (0x6)</em></para>
/// <para>A user has logged off the session identified by lParam.</para>
/// <para><em><c>WTS_SESSION_LOCK</c> (0x7)</em></para>
/// <para>The session identified by lParam has been locked.</para>
/// <para><em><c>WTS_SESSION_UNLOCK</c> (0x8)</em></para>
/// <para>The session identified by lParam has been unlocked.</para>
/// <para><em><c>WTS_SESSION_REMOTE_CONTROL</c> (0x9)</em></para>
/// <para>
/// The session identified by lParam has changed its remote controlled status. To determine the status, call
/// <c>GetSystemMetrics</c> and check the <c>SM_REMOTECONTROL</c> metric.
/// </para>
/// <para><em><c>WTS_SESSION_CREATE</c> (0xA)</em></para>
/// <para>Reserved for future use.</para>
/// <para><em><c>WTS_SESSION_TERMINATE</c> (0xB)</em></para>
/// <para>Reserved for future use.</para>
/// <para><strong>Returns</strong></para>
/// <para>The return value is ignored.</para>
/// <remarks>
/// <para>This message is sent only to applications that have registered to receive this message by calling <c>WTSRegisterSessionNotification</c>.</para>
/// <para>
/// Examples of how applications can respond to this message include releasing or acquiring console-specific resources,
/// determining how a screen is to be painted, or triggering console animation effects.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/termserv/wm-wtssession-change
WM_WTSSESSION_CHANGE = 0x02B1,
/// <summary/>
WM_TABLET_LAST = 0x02df,
/// <summary>
/// <para>
/// Sent when the effective dots per inch (dpi) for a window has changed. The DPI is the scale factor for a window. There are
/// multiple events that can cause the DPI to change. The following list indicates the possible causes for the change in DPI.
/// </para>
/// <list type="bullet">
/// <item>
/// <term>The window is moved to a new monitor that has a different DPI.</term>
/// </item>
/// <item>
/// <term>The DPI of the monitor hosting the window changes.</term>
/// </item>
/// </list>
/// <para>
/// The current DPI for a window always equals the last DPI sent by <c>WM_DPICHANGED</c>. This is the scale factor that the
/// window should be scaling to for threads that are aware of DPI changes.
/// </para>
/// <para>
/// <code>#define WM_DPICHANGED 0x02E0</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The <c>HIWORD</c> of the wParam contains the Y-axis value of the new dpi of the window. The <c>LOWORD</c> of the wParam
/// contains the X-axis value of the new DPI of the window. For example, 96, 120, 144, or 192. The values of the X-axis and the
/// Y-axis are identical for Windows apps.
/// </para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>RECT</c> structure that provides a suggested size and position of the current window scaled for the new
/// DPI. The expectation is that apps will reposition and resize windows based on the suggestions provided by lParam when
/// handling this message.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// This message is only relevant for <c>PROCESS_PER_MONITOR_DPI_AWARE</c> applications or <c>DPI_AWARENESS_PER_MONITOR_AWARE</c>
/// threads. It may be received on certain DPI changes if your top-level window or process is running as <c>DPI unaware</c> or
/// <c>system DPI aware</c>, but in those situations it can be safely ignored. For more information about the different types of
/// awareness, see <c>PROCESS_DPI_AWARENESS</c> and <c>DPI_AWARENESS</c>. Older versions of Windows required DPI awareness to be
/// tied at the level of an application. Those apps use <c>PROCESS_DPI_AWARENESS</c>. Currently, DPI awareness is tied to threads
/// and individual windows rather than the entire application. These apps use <c>DPI_AWARENESS</c>.
/// </para>
/// <para>You only need to use either the X-axis or the Y-axis value when scaling your application since they are the same.</para>
/// <para>
/// In order to handle this message correctly, you will need to resize and reposition your window based on the suggestions
/// provided by lParam and using <c>SetWindowPos</c>. If you do not do this, your window will grow or shrink with respect to
/// everything else on the new monitor. For example, if a user is using multiple monitors and drags your window from a 96 DPI
/// monitor to a 192 DPI monitor, your window will appear to be half as large with respect to other items on the 192 DPI monitor.
/// </para>
/// <para>
/// The base value of DPI is defined as <c>USER_DEFAULT_SCREEN_DPI</c> which is set to 96. To determine the scaling factor for a
/// monitor, take the DPI value and divide by <c>USER_DEFAULT_SCREEN_DPI</c>. The following table provides some sample DPI values
/// and associated scaling factors.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>DPI value</term>
/// <term>Scaling percentage</term>
/// </listheader>
/// <item>
/// <term>96</term>
/// <term>100%</term>
/// </item>
/// <item>
/// <term>120</term>
/// <term>125%</term>
/// </item>
/// <item>
/// <term>144</term>
/// <term>150%</term>
/// </item>
/// <item>
/// <term>192</term>
/// <term>200%</term>
/// </item>
/// </list>
/// <para>The following example provides a sample DPI change handler.</para>
/// <para>
/// <code> case WM_DPICHANGED: { g_dpi = HIWORD(wParam); UpdateDpiDependentFontsAndResources(); RECT* const prcNewWindow = (RECT*)lParam; SetWindowPos(hWnd, NULL, prcNewWindow -&gt;left, prcNewWindow -&gt;top, prcNewWindow-&gt;right - prcNewWindow-&gt;left, prcNewWindow-&gt;bottom - prcNewWindow-&gt;top, SWP_NOZORDER | SWP_NOACTIVATE); break; }</code>
/// </para>
/// <para>The following code linearly scales a value from 100% (96 DPI) to an arbitrary DPI defined by g_dpi.</para>
/// <para>
/// <code> INT iBorderWidth100 = 5; iBorderWidth = MulDiv(iBorderWidth100, g_dpi, USER_DEFAULT_SCREEN_DPI);</code>
/// </para>
/// <para>An alternative way to scale a value is to convert the DPI value into a scale factor and use that.</para>
/// <para>
/// <code> INT iBorderWidth100 = 5; FLOAT fscale = (float) g_dpi / USER_DEFAULT_SCREEN_DPI; iBorderWidth = iBorderWidth100 * fscale;</code>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/hidpi/wm-dpichanged
WM_DPICHANGED = 0x02E0,
/// <summary>
/// <para>
/// An application sends a <c>WM_CUT</c> message to an edit control or combo box to delete (cut) the current selection, if any,
/// in the edit control and copy the deleted text to the clipboard in <c>CF_TEXT</c> format.
/// </para>
/// <para>
/// <code>#define WM_CUT 0x0300</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>This message does not return a value.</para>
/// <remarks>
/// <para>The deletion performed by the <c>WM_CUT</c> message can be undone by sending the edit control an <c>EM_UNDO</c> message.</para>
/// <para>To delete the current selection without placing the deleted text on the clipboard, use the <c>WM_CLEAR</c> message.</para>
/// <para>
/// When sent to a combo box, the <c>WM_CUT</c> message is handled by its edit control. This message has no effect when sent to a
/// combo box with the <c>CBS_DROPDOWNLIST</c> style.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-cut
WM_CUT = 0x0300,
/// <summary>
/// <para>
/// An application sends the <c>WM_COPY</c> message to an edit control or combo box to copy the current selection to the
/// clipboard in <c>CF_TEXT</c> format.
/// </para>
/// <para>
/// <code>#define WM_COPY 0x0301</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>Returns nonzero value on success, else zero.</para>
/// <remarks>
/// When sent to a combo box, the <c>WM_COPY</c> message is handled by its edit control. This message has no effect when sent to
/// a combo box with the <c>CBS_DROPDOWNLIST</c> style.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copy
WM_COPY = 0x0301,
/// <summary>
/// <para>
/// An application sends a <c>WM_PASTE</c> message to an edit control or combo box to copy the current content of the clipboard
/// to the edit control at the current caret position. Data is inserted only if the clipboard contains data in <c>CF_TEXT</c> format.
/// </para>
/// <para>
/// <code>#define WM_PASTE 0x0302</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>This message does not return a value.</para>
/// <remarks>
/// When sent to a combo box, the <c>WM_PASTE</c> message is handled by its edit control. This message has no effect when sent to
/// a combo box with the <c>CBS_DROPDOWNLIST</c> style.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-paste
WM_PASTE = 0x0302,
/// <summary>
/// <para>
/// An application sends a <c>WM_CLEAR</c> message to an edit control or combo box to delete (clear) the current selection, if
/// any, from the edit control.
/// </para>
/// <para>
/// <code>#define WM_CLEAR 0x0303</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>This message does not return a value.</para>
/// <remarks>
/// <para>The deletion performed by the <c>WM_CLEAR</c> message can be undone by sending the edit control an <c>EM_UNDO</c> message.</para>
/// <para>To delete the current selection and place the deleted content on the clipboard, use the <c>WM_CUT</c> message.</para>
/// <para>
/// When sent to a combo box, the <c>WM_CLEAR</c> message is handled by its edit control. This message has no effect when sent to
/// a combo box with the <c>CBS_DROPDOWNLIST</c> style.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-clear
WM_CLEAR = 0x0303,
/// <summary>
/// An application sends a <c>WM_UNDO</c> message to an edit control to undo the last operation. When this message is sent to an
/// edit control, the previously deleted text is restored or the previously added text is deleted.
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>Not used; must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>If the message succeeds, the return value is <c>TRUE</c>.</para>
/// <para>If the message fails, the return value is <c>FALSE</c>.</para>
/// <remarks><c>Rich Edit:</c> It is recommended that <c>EM_UNDO</c> be used instead of <c>WM_UNDO</c>.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/controls/wm-undo
WM_UNDO = 0x0304,
/// <summary>
/// <para>
/// Sent to the clipboard owner if it has delayed rendering a specific clipboard format and if an application has requested data
/// in that format. The clipboard owner must render data in the specified format and place it on the clipboard by calling the
/// <c>SetClipboardData</c> function.
/// </para>
/// <para>
/// <code>#define WM_RENDERFORMAT 0x0305</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The clipboard format to be rendered.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// When responding to a <c>WM_RENDERFORMAT</c> message, the clipboard owner must not open the clipboard before calling
/// <c>SetClipboardData</c>. Opening the clipboard is not necessary before placing data in response to <c>WM_RENDERFORMAT</c>,
/// and any attempt to open the clipboard will fail because the clipboard is currently being held open by the application that
/// requested the format to be rendered.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-renderformat
WM_RENDERFORMAT = 0x0305,
/// <summary>
/// <para>
/// Sent to the clipboard owner before it is destroyed, if the clipboard owner has delayed rendering one or more clipboard
/// formats. For the content of the clipboard to remain available to other applications, the clipboard owner must render data in
/// all the formats it is capable of generating, and place the data on the clipboard by calling the <c>SetClipboardData</c> function.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_RENDERALLFORMATS 0x0306</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// When responding to a <c>WM_RENDERALLFORMATS</c> message, the application must call the <c>OpenClipboard</c> function and then
/// check that it is still the clipboard owner by calling the <c>GetClipboardOwner</c> function before calling <c>SetClipboardData</c>.
/// </para>
/// <para>
/// The application needs to check that it is still the clipboard owner after opening the clipboard because after it receives the
/// <c>WM_RENDERALLFORMATS</c> message, but before it opens the clipboard, another application may have opened and taken
/// ownership of the clipboard, and that application's data should not be overwritten.
/// </para>
/// <para>
/// In most cases, the application should not call the <c>EmptyClipboard</c> function before calling <c>SetClipboardData</c>,
/// since doing so will erase the clipboard formats that the application has already rendered.
/// </para>
/// <para>
/// When the application returns, the system removes any unrendered formats from the list of available clipboard formats. For
/// information about delayed rendering, see Delayed Rendering.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-renderallformats
WM_RENDERALLFORMATS = 0x0306,
/// <summary>
/// <para>Sent to the clipboard owner when a call to the <c>EmptyClipboard</c> function empties the clipboard.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_DESTROYCLIPBOARD 0x0307</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-destroyclipboard
WM_DESTROYCLIPBOARD = 0x0307,
/// <summary>
/// <para>
/// Sent to the first window in the clipboard viewer chain when the content of the clipboard changes. This enables a clipboard
/// viewer window to display the new content of the clipboard.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_DRAWCLIPBOARD 0x0308</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <remarks>
/// <para>
/// Only clipboard viewer windows receive this message. These are windows that have been added to the clipboard viewer chain by
/// using the <c>SetClipboardViewer</c> function.
/// </para>
/// <para>
/// Each window that receives the <c>WM_DRAWCLIPBOARD</c> message must call the <c>SendMessage</c> function to pass the message
/// on to the next window in the clipboard viewer chain. The handle to the next window in the chain is returned by
/// <c>SetClipboardViewer</c>, and may change in response to a <c>WM_CHANGECBCHAIN</c> message.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-drawclipboard
WM_DRAWCLIPBOARD = 0x0308,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window when the clipboard contains data in the <c>CF_OWNERDISPLAY</c>
/// format and the clipboard viewer's client area needs repainting.
/// </para>
/// <para>
/// <code>#define WM_PAINTCLIPBOARD 0x0309</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the clipboard viewer window.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A handle to a global memory object that contains a <c>PAINTSTRUCT</c> structure. The structure defines the part of the client
/// area to paint.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// To determine whether the entire client area or just a portion of it needs repainting, the clipboard owner must compare the
/// dimensions of the drawing area given in the <c>rcPaint</c> member of <c>PAINTSTRUCT</c> to the dimensions given in the most
/// recent <c>WM_SIZECLIPBOARD</c> message.
/// </para>
/// <para>
/// The clipboard owner must use the <c>GlobalLock</c> function to lock the memory that contains the <c>PAINTSTRUCT</c>
/// structure. Before returning, the clipboard owner must unlock that memory by using the <c>GlobalUnlock</c> function.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-paintclipboard
WM_PAINTCLIPBOARD = 0x0309,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window when the clipboard contains data in the <c>CF_OWNERDISPLAY</c>
/// format and an event occurs in the clipboard viewer's vertical scroll bar. The owner should scroll the clipboard image and
/// update the scroll bar values.
/// </para>
/// <para>
/// <code>#define WM_VSCROLLCLIPBOARD 0x030A</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the clipboard viewer window.</para>
/// <para><em>lParam</em></para>
/// <para>The low-order word of lParam specifies a scroll bar event. This parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SB_BOTTOM</c> 7</term>
/// <term>Scroll to lower right.</term>
/// </item>
/// <item>
/// <term><c>SB_ENDSCROLL</c> 8</term>
/// <term>End scroll.</term>
/// </item>
/// <item>
/// <term><c>SB_LINEDOWN</c> 1</term>
/// <term>Scroll one line down.</term>
/// </item>
/// <item>
/// <term><c>SB_LINEUP</c> 0</term>
/// <term>Scroll one line up.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGEDOWN</c> 3</term>
/// <term>Scroll one page down.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGEUP</c> 2</term>
/// <term>Scroll one page up.</term>
/// </item>
/// <item>
/// <term><c>SB_THUMBPOSITION</c> 4</term>
/// <term>Scroll to absolute position. The current position is specified by the high-order word.</term>
/// </item>
/// <item>
/// <term><c>SB_TOP</c> 6</term>
/// <term>Scroll to upper left.</term>
/// </item>
/// </list>
/// <para>
/// The high-order word of lParam specifies the current position of the scroll box if the low-order word of lParam is
/// <c>SB_THUMBPOSITION</c>; otherwise, the high-order word of lParam is not used.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// The clipboard owner can use the <c>ScrollWindow</c> function to scroll the image in the clipboard viewer window and
/// invalidate the appropriate region.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-vscrollclipboard
WM_VSCROLLCLIPBOARD = 0x030A,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window when the clipboard contains data in the <c>CF_OWNERDISPLAY</c>
/// format and the clipboard viewer's client area has changed size.
/// </para>
/// <para>
/// <code>#define WM_SIZECLIPBOARD 0x030B</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the clipboard viewer window.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A handle to a global memory object that contains a <c>RECT</c> structure. The structure specifies the new dimensions of the
/// clipboard viewer's client area.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// When the clipboard viewer window is about to be destroyed or resized, a <c>WM_SIZECLIPBOARD</c> message is sent with a null
/// rectangle (0, 0, 0, 0) as the new size. This permits the clipboard owner to free its display resources.
/// </para>
/// <para>
/// The clipboard owner must use the <c>GlobalLock</c> function to lock the memory object that contains <c>RECT</c>. Before
/// returning, the clipboard owner must unlock the object by using the <c>GlobalUnlock</c> function.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-sizeclipboard
WM_SIZECLIPBOARD = 0x030B,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window to request the name of a <c>CF_OWNERDISPLAY</c> clipboard format.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_ASKCBFORMATNAME 0x030C</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>The size, in characters, of the buffer pointed to by the lParam parameter.</para>
/// <para><em>lParam</em></para>
/// <para>A pointer to the buffer that is to receive the clipboard format name.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// In response to this message, the clipboard owner should copy the name of the owner-display format to the specified buffer,
/// not exceeding the buffer size specified by the wParam parameter.
/// </para>
/// <para>
/// A clipboard viewer window sends this message to the clipboard owner to determine the name of the <c>CF_OWNERDISPLAY</c>
/// format for example, to initialize a menu listing available formats.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-askcbformatname
WM_ASKCBFORMATNAME = 0x030C,
/// <summary>
/// <para>Sent to the first window in the clipboard viewer chain when a window is being removed from the chain.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_CHANGECBCHAIN 0x030D</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window being removed from the clipboard viewer chain.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A handle to the next window in the chain following the window being removed. This parameter is <c>NULL</c> if the window
/// being removed is the last window in the chain.
/// </para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// Each clipboard viewer window saves the handle to the next window in the clipboard viewer chain. Initially, this handle is the
/// return value of the <c>SetClipboardViewer</c> function.
/// </para>
/// <para>
/// When a clipboard viewer window receives the <c>WM_CHANGECBCHAIN</c> message, it should call the <c>SendMessage</c> function
/// to pass the message to the next window in the chain, unless the next window is the window being removed. In this case, the
/// clipboard viewer should save the handle specified by the lParam parameter as the next window in the chain.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-changecbchain
WM_CHANGECBCHAIN = 0x030D,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window. This occurs when the clipboard contains data in the
/// <c>CF_OWNERDISPLAY</c> format and an event occurs in the clipboard viewer's horizontal scroll bar. The owner should scroll
/// the clipboard image and update the scroll bar values.
/// </para>
/// <para>
/// <code>#define WM_HSCROLLCLIPBOARD 0x030E</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the clipboard viewer window.</para>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word of lParam specifies a scroll bar event. This parameter can be one of the following values. The high-order
/// word of lParam specifies the current position of the scroll box if the low-order word of lParam is <c>SB_THUMBPOSITION</c>;
/// otherwise, the high-order word is not used.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>SB_ENDSCROLL</c> 8</term>
/// <term>End scroll.</term>
/// </item>
/// <item>
/// <term><c>SB_LEFT</c> 6</term>
/// <term>Scroll to upper left.</term>
/// </item>
/// <item>
/// <term><c>SB_RIGHT</c> 7</term>
/// <term>Scroll to lower right.</term>
/// </item>
/// <item>
/// <term><c>SB_LINELEFT</c> 0</term>
/// <term>Scrolls left by one unit.</term>
/// </item>
/// <item>
/// <term><c>SB_LINERIGHT</c> 1</term>
/// <term>Scrolls right by one unit.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGELEFT</c> 2</term>
/// <term>Scrolls left by the width of the window.</term>
/// </item>
/// <item>
/// <term><c>SB_PAGERIGHT</c> 3</term>
/// <term>Scrolls right by the width of the window.</term>
/// </item>
/// <item>
/// <term><c>SB_THUMBPOSITION</c> 4</term>
/// <term>Scroll to absolute position. The current position is specified by the high-order word.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// The clipboard owner can use the <c>ScrollWindow</c> function to scroll the image in the clipboard viewer window and
/// invalidate the appropriate region.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-hscrollclipboard
WM_HSCROLLCLIPBOARD = 0x030E,
/// <summary>
/// <para>
/// The <c>WM_QUERYNEWPALETTE</c> message informs a window that it is about to receive the keyboard focus, giving the window the
/// opportunity to realize its logical palette when it receives the focus.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If the window realizes its logical palette, it must return <c>TRUE</c>; otherwise, it must return <c>FALSE</c>.</para>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-querynewpalette
WM_QUERYNEWPALETTE = 0x030F,
/// <summary>
/// <para>The <c>WM_PALETTEISCHANGING</c> message informs applications that an application is going to realize its logical palette.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window that is going to realize its logical palette.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>
/// The application changing its palette does not wait for acknowledgment of this message before changing the palette and sending
/// the <c>WM_PALETTECHANGED</c> message. As a result, the palette may already be changed by the time an application receives
/// this message.
/// </para>
/// <para>
/// If the application either ignores or fails to process this message and a second application realizes its palette while the
/// first is using palette indexes, there is a strong possibility that the user will see unexpected colors during subsequent
/// drawing operations.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-paletteischanging
WM_PALETTEISCHANGING = 0x0310,
/// <summary>
/// <para>
/// The <c>WM_PALETTECHANGED</c> message is sent to all top-level and overlapped windows after the window with the keyboard focus
/// has realized its logical palette, thereby changing the system palette. This message enables a window that uses a color
/// palette but does not have the keyboard focus to realize its logical palette and update its client area.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the window that caused the system palette to change.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used.</para>
/// <remarks>
/// <para>
/// This message must be sent to all top-level and overlapped windows, including the one that changed the system palette. If any
/// child windows use a color palette, this message must be passed on to them as well.
/// </para>
/// <para>
/// To avoid creating an infinite loop, a window that receives this message must not realize its palette, unless it determines
/// that wParam does not contain its own window handle.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-palettechanged
WM_PALETTECHANGED = 0x0311,
/// <summary>
/// <para>
/// Posted when the user presses a hot key registered by the <c>RegisterHotKey</c> function. The message is placed at the top of
/// the message queue associated with the thread that registered the hot key.
/// </para>
/// <para>
/// <code>#define WM_HOTKEY 0x0312</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// The identifier of the hot key that generated the message. If the message was generated by a system-defined hot key, this
/// parameter will be one of the following values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>IDHOT_SNAPDESKTOP</c> -2</term>
/// <term>The "snap desktop" hot key was pressed.</term>
/// </item>
/// <item>
/// <term><c>IDHOT_SNAPWINDOW</c> -1</term>
/// <term>The "snap window" hot key was pressed.</term>
/// </item>
/// </list>
/// <para><em>lParam</em></para>
/// <para>
/// The low-order word specifies the keys that were to be pressed in combination with the key specified by the high-order word to
/// generate the <c>WM_HOTKEY</c> message. This word can be one or more of the following values. The high-order word specifies
/// the virtual key code of the hot key.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MOD_ALT</c> 0x0001</term>
/// <term>Either ALT key was held down.</term>
/// </item>
/// <item>
/// <term><c>MOD_CONTROL</c> 0x0002</term>
/// <term>Either CTRL key was held down.</term>
/// </item>
/// <item>
/// <term><c>MOD_SHIFT</c> 0x0004</term>
/// <term>Either SHIFT key was held down.</term>
/// </item>
/// <item>
/// <term><c>MOD_WIN</c> 0x0008</term>
/// <term>
/// Either WINDOWS key was held down. These keys are labeled with the Windows logo. Hotkeys that involve the Windows key are
/// reserved for use by the operating system.
/// </term>
/// </item>
/// </list>
/// <remarks>
/// <c>WM_HOTKEY</c> is unrelated to the <c>WM_GETHOTKEY</c> and <c>WM_SETHOTKEY</c> hot keys. The <c>WM_HOTKEY</c> message is
/// sent for generic hot keys while the <c>WM_SETHOTKEY</c> and <c>WM_GETHOTKEY</c> messages relate to window activation hot keys.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-hotkey
WM_HOTKEY = 0x0312,
/// <summary>
/// <para>
/// The <c>WM_PRINT</c> message is sent to a window to request that it draw itself in the specified device context, most commonly
/// in a printer device context.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the device context to draw in.</para>
/// <para><em>lParam</em></para>
/// <para>The drawing options. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>PRF_CHECKVISIBLE</c></term>
/// <term>Draws the window only if it is visible.</term>
/// </item>
/// <item>
/// <term><c>PRF_CHILDREN</c></term>
/// <term>Draws all visible children windows.</term>
/// </item>
/// <item>
/// <term><c>PRF_CLIENT</c></term>
/// <term>Draws the client area of the window.</term>
/// </item>
/// <item>
/// <term><c>PRF_ERASEBKGND</c></term>
/// <term>Erases the background before drawing the window.</term>
/// </item>
/// <item>
/// <term><c>PRF_NONCLIENT</c></term>
/// <term>Draws the nonclient area of the window.</term>
/// </item>
/// <item>
/// <term><c>PRF_OWNED</c></term>
/// <term>Draws all owned windows.</term>
/// </item>
/// </list>
/// <remarks>
/// The <c>DefWindowProc</c> function processes this message based on which drawing option is specified: if PRF_CHECKVISIBLE is
/// specified and the window is not visible, do nothing, if PRF_NONCLIENT is specified, draw the nonclient area in the specified
/// device context, if PRF_ERASEBKGND is specified, send the window a <c>WM_ERASEBKGND</c> message, if PRF_CLIENT is specified,
/// send the window a <c>WM_PRINTCLIENT</c> message, if PRF_CHILDREN is set, send each visible child window a <c>WM_PRINT</c>
/// message, if PRF_OWNED is set, send each visible owned window a <c>WM_PRINT</c> message.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-print
WM_PRINT = 0x0317,
/// <summary>
/// <para>
/// The <c>WM_PRINTCLIENT</c> message is sent to a window to request that it draw its client area in the specified device
/// context, most commonly in a printer device context.
/// </para>
/// <para>
/// Unlike <c>WM_PRINT</c>, <c>WM_PRINTCLIENT</c> is not processed by <c>DefWindowProc</c>. A window should process the
/// <c>WM_PRINTCLIENT</c> message through an application-defined <c>WindowProc</c> function for it to be used properly.
/// </para>
/// <para>
/// <code>LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>A handle to the device context to draw in.</para>
/// <para><em>lParam</em></para>
/// <para>The drawing options. This parameter can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>PRF_CHECKVISIBLE</c></term>
/// <term>Draws the window only if it is visible.</term>
/// </item>
/// <item>
/// <term><c>PRF_CHILDREN</c></term>
/// <term>Draws all visible children windows.</term>
/// </item>
/// <item>
/// <term><c>PRF_CLIENT</c></term>
/// <term>Draws the client area of the window.</term>
/// </item>
/// <item>
/// <term><c>PRF_ERASEBKGND</c></term>
/// <term>Erases the background before drawing the window.</term>
/// </item>
/// <item>
/// <term><c>PRF_NONCLIENT</c></term>
/// <term>Draws the nonclient area of the window.</term>
/// </item>
/// <item>
/// <term><c>PRF_OWNED</c></term>
/// <term>Draws all owned windows.</term>
/// </item>
/// </list>
/// <remarks>
/// <para>
/// A window can process this message in much the same manner as <c>WM_PAINT</c>, except that <c>BeginPaint</c> and
/// <c>EndPaint</c> need not be called (a device context is provided), and the window should draw its entire client area rather
/// than just the invalid region.
/// </para>
/// <para>
/// Windows that can be used anywhere in the system, such as controls, should process this message. It is probably worthwhile for
/// other windows to process this message as well because it is relatively easy to implement.
/// </para>
/// <para>The AnimateWindow function requires that the window being animated implements the <c>WM_PRINTCLIENT</c> message.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/gdi/wm-printclient
WM_PRINTCLIENT = 0x0318,
/// <summary>
/// <para>
/// Notifies a window that the user generated an application command event, for example, by clicking an application command
/// button using the mouse or typing an application command key on the keyboard.
/// </para>
/// <para>
/// <code>#define WM_APPCOMMAND 0x0319</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// A handle to the window where the user clicked the button or pressed the key. This can be a child window of the window
/// receiving the message. For more information about processing this message, see the Remarks section.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Use the following code to get the information contained in the lParam parameter.</para>
/// <para>
/// <code>cmd = GET_APPCOMMAND_LPARAM(lParam); uDevice = GET_DEVICE_LPARAM(lParam); dwKeys = GET_KEYSTATE_LPARAM(lParam);</code>
/// </para>
/// <para>The application command is cmd, which can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>APPCOMMAND_BASS_BOOST</c> 20</term>
/// <term>Toggle the bass boost on and off.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BASS_DOWN</c> 19</term>
/// <term>Decrease the bass.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BASS_UP</c> 21</term>
/// <term>Increase the bass.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_BACKWARD</c> 1</term>
/// <term>Navigate backward.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_FAVORITES</c> 6</term>
/// <term>Open favorites.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_FORWARD</c> 2</term>
/// <term>Navigate forward.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_HOME</c> 7</term>
/// <term>Navigate home.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_REFRESH</c> 3</term>
/// <term>Refresh page.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_SEARCH</c> 5</term>
/// <term>Open search.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_BROWSER_STOP</c> 4</term>
/// <term>Stop download.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_CLOSE</c> 31</term>
/// <term>Close the window (not the application).</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_COPY</c> 36</term>
/// <term>Copy the selection.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_CORRECTION_LIST</c> 45</term>
/// <term>Brings up the correction list when a word is incorrectly identified during speech input.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_CUT</c> 37</term>
/// <term>Cut the selection.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE</c> 43</term>
/// <term>
/// Toggles between two modes of speech input: dictation and command/control (giving commands to an application or accessing menus).
/// </term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_FIND</c> 28</term>
/// <term>Open the <c>Find</c> dialog.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_FORWARD_MAIL</c> 40</term>
/// <term>Forward a mail message.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_HELP</c> 27</term>
/// <term>Open the <c>Help</c> dialog.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_LAUNCH_APP1</c> 17</term>
/// <term>Start App1.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_LAUNCH_APP2</c> 18</term>
/// <term>Start App2.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_LAUNCH_MAIL</c> 15</term>
/// <term>Open mail.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_LAUNCH_MEDIA_SELECT</c> 16</term>
/// <term>Go to Media Select mode.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_CHANNEL_DOWN</c> 52</term>
/// <term>Decrement the channel value, for example, for a TV or radio tuner.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_CHANNEL_UP</c> 51</term>
/// <term>Increment the channel value, for example, for a TV or radio tuner.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_FAST_FORWARD</c> 49</term>
/// <term>
/// Increase the speed of stream playback. This can be implemented in many ways, for example, using a fixed speed or toggling
/// through a series of increasing speeds.
/// </term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_NEXTTRACK</c> 11</term>
/// <term>Go to next track.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_PAUSE</c> 47</term>
/// <term>
/// Pause. If already paused, take no further action. This is a direct PAUSE command that has no state. If there are discrete
/// Play and Pause buttons, applications should take action on this command as well as <c>APPCOMMAND_MEDIA_PLAY_PAUSE</c>.
/// </term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_PLAY</c> 46</term>
/// <term>
/// Begin playing at the current position. If already paused, it will resume. This is a direct PLAY command that has no state. If
/// there are discrete <c>Play</c> and <c>Pause</c> buttons, applications should take action on this command as well as <c>APPCOMMAND_MEDIA_PLAY_PAUSE</c>.
/// </term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_PLAY_PAUSE</c> 14</term>
/// <term>
/// Play or pause playback. If there are discrete <c>Play</c> and <c>Pause</c> buttons, applications should take action on this
/// command as well as <c>APPCOMMAND_MEDIA_PLAY</c> and <c>APPCOMMAND_MEDIA_PAUSE</c>.
/// </term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_PREVIOUSTRACK</c> 12</term>
/// <term>Go to previous track.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_RECORD</c> 48</term>
/// <term>Begin recording the current stream.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_REWIND</c> 50</term>
/// <term>
/// Go backward in a stream at a higher rate of speed. This can be implemented in many ways, for example, using a fixed speed or
/// toggling through a series of increasing speeds.
/// </term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MEDIA_STOP</c> 13</term>
/// <term>Stop playback.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MIC_ON_OFF_TOGGLE</c> 44</term>
/// <term>Toggle the microphone.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MICROPHONE_VOLUME_DOWN</c> 25</term>
/// <term>Decrease microphone volume.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MICROPHONE_VOLUME_MUTE</c> 24</term>
/// <term>Mute the microphone.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_MICROPHONE_VOLUME_UP</c> 26</term>
/// <term>Increase microphone volume.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_NEW</c> 29</term>
/// <term>Create a new window.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_OPEN</c> 30</term>
/// <term>Open a window.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_PASTE</c> 38</term>
/// <term>Paste</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_PRINT</c> 33</term>
/// <term>Print current document.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_REDO</c> 35</term>
/// <term>Redo last action.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_REPLY_TO_MAIL</c> 39</term>
/// <term>Reply to a mail message.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_SAVE</c> 32</term>
/// <term>Save current document.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_SEND_MAIL</c> 41</term>
/// <term>Send a mail message.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_SPELL_CHECK</c> 42</term>
/// <term>Initiate a spell check.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_TREBLE_DOWN</c> 22</term>
/// <term>Decrease the treble.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_TREBLE_UP</c> 23</term>
/// <term>Increase the treble.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_UNDO</c> 34</term>
/// <term>Undo last action.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_VOLUME_DOWN</c> 9</term>
/// <term>Lower the volume.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_VOLUME_MUTE</c> 8</term>
/// <term>Mute the volume.</term>
/// </item>
/// <item>
/// <term><c>APPCOMMAND_VOLUME_UP</c> 10</term>
/// <term>Raise the volume.</term>
/// </item>
/// </list>
/// <para>The uDevice component indicates the input device that generated the input event, and can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>FAPPCOMMAND_KEY</c> 0</term>
/// <term>User pressed a key.</term>
/// </item>
/// <item>
/// <term><c>FAPPCOMMAND_MOUSE</c> 0x8000</term>
/// <term>User clicked a mouse button.</term>
/// </item>
/// <item>
/// <term><c>FAPPCOMMAND_OEM</c> 0x1000</term>
/// <term>An unidentified hardware source generated the event. It could be a mouse or a keyboard event.</term>
/// </item>
/// </list>
/// <para>The dwKeys component indicates whether various virtual keys are down, and can be one or more of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term><c>MK_CONTROL</c> 0x0008</term>
/// <term>The CTRL key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_LBUTTON</c> 0x0001</term>
/// <term>The left mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_MBUTTON</c> 0x0010</term>
/// <term>The middle mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_RBUTTON</c> 0x0002</term>
/// <term>The right mouse button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_SHIFT</c> 0x0004</term>
/// <term>The SHIFT key is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON1</c> 0x0020</term>
/// <term>The first X button is down.</term>
/// </item>
/// <item>
/// <term><c>MK_XBUTTON2</c> 0x0040</term>
/// <term>The second X button is down.</term>
/// </item>
/// </list>
/// <para><strong>Returns</strong></para>
/// <para>
/// If an application processes this message, it should return <c>TRUE</c>. For more information about processing the return
/// value, see the Remarks section.
/// </para>
/// <remarks>
/// <para>
/// <c>DefWindowProc</c> generates the <c>WM_APPCOMMAND</c> message when it processes the <c>WM_XBUTTONUP</c> or
/// <c>WM_NCXBUTTONUP</c> message, or when the user types an application command key.
/// </para>
/// <para>
/// If a child window does not process this message and instead calls <c>DefWindowProc</c>, <c>DefWindowProc</c> will send the
/// message to its parent window. If a top level window does not process this message and instead calls <c>DefWindowProc</c>,
/// <c>DefWindowProc</c> will call a shell hook with the hook code equal to <c>HSHELL_APPCOMMAND</c>.
/// </para>
/// <para>
/// To get the coordinates of the cursor if the message was generated by a mouse click, the application can call
/// <c>GetMessagePos</c>. An application can test whether the message was generated by the mouse by checking whether lParam
/// contains <c>FAPPCOMMAND_MOUSE</c>.
/// </para>
/// <para>
/// Unlike other windows messages, an application should return <c>TRUE</c> from this message if it processes it. Doing so will
/// allow software that simulates this message on Windows systems earlier than Windows 2000 to determine whether the window
/// procedure processed the message or called <c>DefWindowProc</c> to process it.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-appcommand
WM_APPCOMMAND = 0x0319,
/// <summary>
/// <para>
/// Broadcast to every window following a theme change event. Examples of theme change events are the activation of a theme, the
/// deactivation of a theme, or a transition from one theme to another.
/// </para>
/// <para>
/// <code>#define WM_THEMECHANGED 0x031A</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is reserved.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is reserved.</para>
/// <para><strong>Returns</strong></para>
/// <para>Type: <c>LRESULT</c></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <para>Note</para>
/// <para>This message is posted by the operating system. Applications typically do not send this message.</para>
/// </para>
/// <para>
/// Themes are specifications for the appearance of controls, so that the visual element of a control is treated separately from
/// its functionality.
/// </para>
/// <para>To release an existing theme handle, call <c>CloseThemeData</c>. To acquire a new theme handle, use <c>OpenThemeData</c>.</para>
/// <para>
/// Following the <c>WM_THEMECHANGED</c> broadcast, any existing theme handles are invalid. A theme-aware window should release
/// and reopen any of its pre-existing theme handles when it receives the <c>WM_THEMECHANGED</c> message. If the
/// <c>OpenThemeData</c> function returns <c>NULL</c>, the window should paint unthemed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-themechanged
WM_THEMECHANGED = 0x031A,
/// <summary>
/// <para>Sent when the contents of the clipboard have changed.</para>
/// <para>
/// <code>#define WM_CLIPBOARDUPDATE 0x031D</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><em>lParam</em></para>
/// <para>This parameter is not used and must be zero.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>To register a window to receive this message, use the <c>AddClipboardFormatListener</c> function.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-clipboardupdate
WM_CLIPBOARDUPDATE = 0x031D,
/// <summary>
/// <para>Informs all top-level windows that Desktop Window Manager (DWM) composition has been enabled or disabled.</para>
/// <para>
/// <para>Note</para>
/// <para>As of Windows 8, DWM composition is always enabled, so this message is not sent regardless of video mode changes.</para>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Not used.</para>
/// <para><em>lParam</em></para>
/// <para>Not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>The <c>DwmIsCompositionEnabled</c> function can be used to determine the current composition state.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dwm/wm-dwmcompositionchanged
WM_DWMCOMPOSITIONCHANGED = 0x031E,
/// <summary>Sent when the non-client area rendering policy has changed.</summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>
/// Specifies whether DWM rendering is enabled for the non-client area of the window. <c>TRUE</c> if enabled; otherwise, <c>FALSE</c>.
/// </para>
/// <para><em>lParam</em></para>
/// <para>Not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// The <c>DwmGetWindowAttribute</c> and <c>DwmSetWindowAttribute</c> functions are used to get or set the non-client rendering policy.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dwm/wm-dwmncrenderingchanged
WM_DWMNCRENDERINGCHANGED = 0x031F,
/// <summary>Informs all top-level windows that the colorization color has changed.</summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Specifies the new colorization color. The color format is 0xAARRGGBB.</para>
/// <para><em>lParam</em></para>
/// <para>Specifies whether the new color is blended with opacity.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// <para><c>DwmGetColorizationColor</c> is used to determine the current color value.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/dwm/wm-dwmcolorizationcolorchanged
WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320,
/// <summary>Sent when a Desktop Window Manager (DWM) composed window is maximized.</summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>Set to true to specify that the window has been maximized.</para>
/// <para><em>lParam</em></para>
/// <para>Not used.</para>
/// <para><strong>Returns</strong></para>
/// <para>If an application processes this message, it should return zero.</para>
/// <remarks>A window receives this message through its <c>WindowProc</c> function.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/dwm/wm-dwmwindowmaximizedchange
WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321,
/// <summary>
/// <para>Sent to request extended title bar information. A window receives this message through its <c>WindowProc</c> function.</para>
/// <para>
/// <code>#define WM_GETTITLEBARINFOEX 0x033F</code>
/// </para>
/// </summary>
/// <para><strong>Parameters</strong></para>
/// <para><em>wParam</em></para>
/// <para>This parameter is not used and must be 0.</para>
/// <para><em>lParam</em></para>
/// <para>
/// A pointer to a <c>TITLEBARINFOEX</c> structure. The message sender is responsible for allocating memory for this structure.
/// Set the <c>cbSize</c> member of this structure to
/// <code>sizeof(TITLEBARINFOEX)</code>
/// before passing this structure with the message.
/// </para>
/// <remarks>
/// <para>
/// The following example shows how the message receiver casts an <c>LPARAM</c> value to retrieve the <c>TITLEBARINFOEX</c> structure.
/// </para>
/// <para>
/// <code>TITLEBARINFOEX *ptinfo = (TITLEBARINFOEX *)lParam;</code>
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/menurc/wm-gettitlebarinfoex
WM_GETTITLEBARINFOEX = 0x033F,
/// <summary/>
WM_HANDHELDFIRST = 0x0358,
/// <summary/>
WM_HANDHELDLAST = 0x035F,
/// <summary/>
WM_AFXFIRST = 0x0360,
/// <summary/>
WM_AFXLAST = 0x037F,
/// <summary/>
WM_PENWINFIRST = 0x0380,
/// <summary/>
WM_PENWINLAST = 0x038F,
/// <summary>
/// <para>Used to define private messages, usually of the form <c>WM_APP</c>+x, where x is an integer value.</para>
/// <para>
/// <code>#define WM_APP 0x8000</code>
/// </para>
/// </summary>
/// <remarks>
/// <para>
/// The <c>WM_APP</c> constant is used to distinguish between message values that are reserved for use by the system and values
/// that can be used by an application to send messages within a private window class. The following are the ranges of message
/// numbers available.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Range</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0 through <c>WM_USER</c> 1</term>
/// <term>Messages reserved for use by the system.</term>
/// </item>
/// <item>
/// <term><c>WM_USER</c> through 0x7FFF</term>
/// <term>Integer messages for use by private window classes.</term>
/// </item>
/// <item>
/// <term><c>WM_APP</c> through 0xBFFF</term>
/// <term>Messages available for use by applications.</term>
/// </item>
/// <item>
/// <term>0xC000 through 0xFFFF</term>
/// <term>String messages for use by applications.</term>
/// </item>
/// <item>
/// <term>Greater than 0xFFFF</term>
/// <term>Reserved by the system.</term>
/// </item>
/// </list>
/// <para>
/// Message numbers in the first range (0 through <c>WM_USER</c> 1) are defined by the system. Values in this range that are not
/// explicitly defined are reserved by the system.
/// </para>
/// <para>
/// Message numbers in the second range ( <c>WM_USER</c> through 0x7FFF) can be defined and used by an application to send
/// messages within a private window class. These values cannot be used to define messages that are meaningful throughout an
/// application because some predefined window classes already define values in this range. For example, predefined control
/// classes such as <c>BUTTON</c>, <c>EDIT</c>, <c>LISTBOX</c>, and <c>COMBOBOX</c> may use these values. Messages in this range
/// should not be sent to other applications unless the applications have been designed to exchange messages and to attach the
/// same meaning to the message numbers.
/// </para>
/// <para>
/// Message numbers in the third range (0x8000 through 0xBFFF) are available for applications to use as private messages.
/// Messages in this range do not conflict with system messages.
/// </para>
/// <para>
/// Message numbers in the fourth range (0xC000 through 0xFFFF) are defined at run time when an application calls the
/// <c>RegisterWindowMessage</c> function to retrieve a message number for a string. All applications that register the same
/// string can use the associated message number for exchanging messages. The actual message number, however, is not a constant
/// and cannot be assumed to be the same between different sessions.
/// </para>
/// <para>Message numbers in the fifth range (greater than 0xFFFF) are reserved by the system.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-app
WM_APP = 0x8000,
/// <summary>
/// <para>
/// Used to define private messages for use by private window classes, usually of the form <c>WM_USER</c>+x, where x is an
/// integer value.
/// </para>
/// <para>
/// <code>#define WM_USER 0x0400</code>
/// </para>
/// </summary>
/// <remarks>
/// <para>The following are the ranges of message numbers.</para>
/// <list type="table">
/// <listheader>
/// <term>Range</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0 through <c>WM_USER</c> 1</term>
/// <term>Messages reserved for use by the system.</term>
/// </item>
/// <item>
/// <term><c>WM_USER</c> through 0x7FFF</term>
/// <term>Integer messages for use by private window classes.</term>
/// </item>
/// <item>
/// <term><c>WM_APP</c> (0x8000) through 0xBFFF</term>
/// <term>Messages available for use by applications.</term>
/// </item>
/// <item>
/// <term>0xC000 through 0xFFFF</term>
/// <term>String messages for use by applications.</term>
/// </item>
/// <item>
/// <term>Greater than 0xFFFF</term>
/// <term>Reserved by the system.</term>
/// </item>
/// </list>
/// <para>
/// Message numbers in the first range (0 through <c>WM_USER</c> 1) are defined by the system. Values in this range that are not
/// explicitly defined are reserved by the system.
/// </para>
/// <para>
/// Message numbers in the second range ( <c>WM_USER</c> through 0x7FFF) can be defined and used by an application to send
/// messages within a private window class. These values cannot be used to define messages that are meaningful throughout an
/// application because some predefined window classes already define values in this range. For example, predefined control
/// classes such as <c>BUTTON</c>, <c>EDIT</c>, <c>LISTBOX</c>, and <c>COMBOBOX</c> may use these values. Messages in this range
/// should not be sent to other applications unless the applications have been designed to exchange messages and to attach the
/// same meaning to the message numbers.
/// </para>
/// <para>
/// Message numbers in the third range (0x8000 through 0xBFFF) are available for applications to use as private messages.
/// Messages in this range do not conflict with system messages.
/// </para>
/// <para>
/// Message numbers in the fourth range (0xC000 through 0xFFFF) are defined at run time when an application calls the
/// <c>RegisterWindowMessage</c> function to retrieve a message number for a string. All applications that register the same
/// string can use the associated message number for exchanging messages. The actual message number, however, is not a constant
/// and cannot be assumed to be the same between different sessions.
/// </para>
/// <para>Message numbers in the fifth range (greater than 0xFFFF) are reserved by the system.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-user
WM_USER = 0x0400,
/// <summary>
/// An application sends the WM_CPL_LAUNCH message to Windows Control Panel to request that a Control Panel application be started.
/// </summary>
WM_CPL_LAUNCH = WM_USER + 0x1000,
/// <summary>
/// The WM_CPL_LAUNCHED message is sent when a Control Panel application, started by the WM_CPL_LAUNCH message, has closed. The
/// WM_CPL_LAUNCHED message is sent to the window identified by the wParam parameter of the WM_CPL_LAUNCH message that started
/// the application.
/// </summary>
WM_CPL_LAUNCHED = WM_USER + 0x1001,
/// <summary>
/// Reflects messages back to child controls. Sometimes you want to write a self-contained control based on standard Windows
/// control, typically by using subclassing or superclassing. Unfortunately, most standard controls send interesting
/// notifications to their parents, not to themselves, so your window proc won't normally receive them. A parent window could
/// help by reflecting (sending) those messages back to the child window so that your window proc could process them. By
/// convention, a message WM_X is reflected back as (OCM__BASE + WM_X). This is mainly to avoid conflicts with real notifications
/// coming from the child windows of the control (e.g. a list view control has a header control as its child window, and receives
/// WM_NOTIFY from the header. It would be inconvenient if you had to figure out every time whether WM_NOTIFY came from the
/// header or reflected from your parent).
/// </summary>
WM_REFLECT = WM_USER + 0x1C00,
/// <summary>
/// WM_SYSTIMER is a well-known yet still undocumented message. Windows uses WM_SYSTIMER for internal actions like scrolling.
/// </summary>
WM_SYSTIMER = 0x118,
}
}
}