窗口(窗口和消息)
在基于Windows的图形应用程序中,窗口是屏幕的矩形区域,应用程序显示输出并接收用户的输入。 因此,基于图形化应用程序Windows任务之一是创建窗口。
窗口与其他窗口(包括来自其他应用程序的窗口)共享屏幕。 一次只能有一个窗口接收用户的输入。 用户可以使用鼠标、键盘或其他输入设备来与此窗口和拥有它的应用程序进行交互。
本节内容 名称说明有关 Windows描述应用程序用于创建和使用窗口的编程元素;管理窗口之间的关系;和大小、移动和显示窗口。使用 Windows包含执行与使用窗口关联的任务的示例。窗口功能讨论窗口的功能,例如窗口类型、状态、大小和位置。窗口参考包含 API 引用。 窗口函数 名称说明AdjustWindowRect根据所需的客户端矩形大小计算窗口矩形的所需大小。 然后,可以将窗口矩形传递给 CreateWindow 函数,以创建其工作区为所需大小的窗口。AdjustWindowRectEx根据客户端矩形的所需大小计算窗口矩形的所需大小。 然后,可以将窗口矩形传递给 CreateWindowEx 函数,以创建工作区为所需大小的窗口。AllowSetForegroundWindow允许指定进程使用 SetForegroundWindow 函数设置前台 窗口。 调用进程必须已能够设置前台窗口。 有关详细信息,请参阅本主题稍后的备注。AnimateWindow使你能够在显示或隐藏窗口时产生特殊效果。 有四种类型的动画:滚动、滑动、折叠或展开以及 alpha 混合淡入淡出。AnyPopup指示屏幕上是否存在拥有、可见、顶级弹出窗口或重叠窗口。 函数将搜索整个屏幕,而不只是调用应用程序的工作区。ArrangeIconicWindows排列指定父窗口 () 窗口的所有最小化窗口。BeginDeferWindowPos为多窗口位置结构分配内存,并返回结构的句柄。BringWindowToTop将指定的窗口放在 Z 顺序的顶部。 如果窗口是顶级窗口,则激活该窗口。 如果窗口是子窗口,则激活与子窗口关联的顶级父窗口。CalculatePopupWindowPosition使用指定的定位点、弹出窗口大小、标志和可选的排除矩形计算适当的弹出窗口位置。 当指定的弹出窗口大小小于桌面窗口大小时,请使用 CalculatePopupWindowPosition 函数来确保弹出窗口在桌面窗口中完全可见,而不考虑指定的定位点。CascadeWindows级联指定父窗口的指定子窗口。ChangeWindowMessageFilter在 UIPI 消息筛选器的 用户界面 Privilege Isolation (添加) 消息。ChangeWindowMessageFilterEx修改指定窗口的 UIPI 消息筛选器。ChildWindowFromPoint确定属于父窗口的子窗口包含指定点(如果有)。 搜索仅限于即时子窗口。 不搜索子代和更深层的子代窗口。ChildWindowFromPointEx确定属于指定父窗口的子窗口包含指定点(如果有)。 函数可以忽略不可见、已禁用和透明的子窗口。 搜索仅限于即时子窗口。 不搜索子代和更深层的后代。CloseWindow最小化 (,但不销毁) 窗口。CreateWindow创建重叠的弹出窗口或子窗口。 它指定窗口类、窗口标题、窗口样式和 (,) 窗口的初始位置和大小。 函数还指定窗口的父级或所有者(如果有)和窗口的菜单。CreateWindowEx创建具有扩展窗口样式的重叠窗口、弹出窗口或子窗口;否则,此函数与 CreateWindow 函数相同。 有关创建窗口以及 CreateWindowEx的其他参数的完整说明,请参阅 CreateWindow。DeferWindowPos更新指定的多窗口 – 指定窗口的位置结构。 然后,函数将句柄返回到更新后的 结构。 EndDeferWindowPos函数使用此结构中的信息同时更改多个窗口的位置和大小。 BeginDeferWindowPos函数创建 结构。取消注册ShellHookWindow取消注册注册以接收 Shell 挂钩消息的指定 Shell 窗口。 它取消注册通过调用 RegisterShellHookWindow 函数注册的窗口。DestroyWindow销毁指定的窗口。 函数将 WM _ DESTROY 和 WM _ NCDESTROY 消息发送到窗口以停用它并从中删除键盘焦点。 该函数还会销毁窗口的菜单、刷新线程消息队列、销毁计时器、删除剪贴板所有权,以及中断剪贴板查看器链 (如果窗口位于查看器链顶部) 。EndDeferWindowPos在单个屏幕刷新周期中同时更新一个或多个窗口的位置和大小。EndTask强制关闭指定的窗口。EnumChildProc与 EnumChildWindows 函数一起使用的应用程序定义的回调函数。 它接收子窗口句柄。 WNDENUMPROC 类型定义指向此回调函数的指针。 EnumChildProc 是应用程序定义的函数名称的占位符。EnumChildWindows通过反过来将句柄传递给应用程序定义的回调函数,枚举属于指定父窗口的子窗口。 EnumChildWindows 将继续运行,直到枚举最后一个子窗口或回调函数返回 FALSE。EnumThreadWindows通过向每个窗口传递句柄,进而将句柄传递给应用程序定义的回调函数,枚举与线程关联的所有非子窗口。 EnumThreadWindows 继续,直到枚举最后一个窗口或回调函数返回 FALSE。 若要枚举特定窗口的子窗口,请使用 EnumChildWindows 函数。EnumThreadWndProc与 EnumThreadWindows 函数一起使用的应用程序定义的回调函数。 它接收与线程关联的窗口句柄。 WNDENUMPROC 类型定义指向此回调函数的指针。 EnumThreadWndProc 是应用程序定义的函数名称的占位符。EnumWindows通过将句柄传递给应用程序定义的回调函数,在屏幕上枚举所有顶级窗口。 EnumWindows 将继续,直到枚举最后一个顶级窗口,或者回调函数返回 FALSE。EnumWindowsProc与 EnumWindows 或 EnumDesktopWindows 函数一起使用的应用程序定义的回调函数。 它将接收顶级窗口句柄。 WNDENUMPROC 类型定义指向此回调函数的指针。 EnumWindowsProc 是应用程序定义的函数名称的占位符。FindWindow检索顶级窗口的句柄,其类名称和窗口名称与指定的字符串匹配。 此函数不搜索子窗口。 此函数不执行区分大小写的搜索。FindWindowEx检索窗口的句柄,其类名称和窗口名称与指定的字符串匹配。 函数搜索子窗口,该窗口从指定的子窗口之后的位置开始。 此函数不执行区分大小写的搜索。GetAltTabInfo检索指定窗口的状态信息,前提是它是应用程序切换 (ALT + TAB) "窗口。GetAncestor检索指定窗口的上级的句柄。GetClientRect检索窗口的工作区坐标。 工作区坐标指定工作区的左上角和右下角。 因为客户端坐标相对于窗口工作区的左上角,所以左上角的坐标是 (0,0) 。GetDesktopWindow返回桌面窗口的句柄。 桌面窗口将覆盖整个屏幕。 桌面窗口是在其上绘制其他窗口的区域。GetForegroundWindow返回前台窗口的句柄, (用户当前正在) 的窗口。 系统为创建前台窗口的线程分配一个略高的优先级,而不是对其他线程。GetGUIThreadInfo检索有关活动窗口或指定 GUI 线程的信息。GetLastActivePopup确定指定的窗口所拥有的弹出窗口最近处于活动状态。GetLayeredWindowAttributes检索分层窗口的不透明度和透明度颜色键。GetNextWindow检索 Z 顺序中的下一个或上一个窗口的句柄。 下一个窗口位于指定窗口之下;上一个窗口位于上方。 如果指定的窗口是最顶层的窗口,则函数会检索到下一个 (或上一个) 最顶层窗口的句柄。 如果指定的窗口为顶级窗口,则函数会检索下一个 (或上一个) 顶级窗口的句柄。 如果指定的窗口是子窗口,则函数会搜索下一 (或上一个) 子窗口的句柄。GetParent检索指定窗口的父或所有者的句柄。GetProcessDefaultLayout检索在没有父或所有者的情况下创建 windows 时使用的默认布局。GetShellWindow返回 Shell 桌面窗口的句柄。GetTitleBarInfo检索有关指定标题栏的信息。GetTopWindow检查与指定的父窗口关联的子窗口的 Z 顺序,并检索 Z 顺序顶部子窗口的句柄。GetWindow检索具有指定的关系 (Z 顺序 或所有者) 到指定窗口的窗口的句柄。GetWindowDisplayAffinity从任何进程检索给定窗口的当前显示相关性设置。GetWindowInfo检索有关指定窗口的信息。GetWindowModuleFileName检索与指定的窗口句柄关联的模块的完整路径和文件名。GetWindowPlacement检索指定窗口的显示状态和已还原、最小化和最大化位置。GetWindowRect检索指定窗口的边框的尺寸。 尺寸在屏幕坐标中以相对于屏幕左上角的形式提供。GetWindowText复制指定窗口标题栏的文本 (如果它有一个) 到缓冲区中。 如果指定的窗口是控件,则复制控件的文本。 但是, GetWindowText 无法检索另一应用程序中控件的文本。GetWindowTextLength检索指定窗口标题栏文本的长度(以字符为字符), (如果窗口具有标题栏) 。 如果指定的窗口是控件,则函数将检索控件内文本的长度。 但是, GetWindowTextLength 无法在另一个应用程序中检索编辑控件文本的长度。GetWindowThreadProcessId检索创建指定窗口的线程的标识符,还可以检索创建该窗口的进程的标识符。IsChild确定窗口是指定的父窗口的子窗口还是子窗口。 如果父窗口位于父窗口的链中,则子窗口是指定父窗口的直接后代;父窗口的链从原始的重叠或弹出窗口到子窗口。IsGUIThread确定调用线程是否已是 GUI 线程。 它还可以选择性地将线程转换为 GUI 线程。IsHungAppWindow确定 Windows 是否认为指定的应用程序没有响应。 如果应用程序未等待输入、未处于启动处理状态,并且在5秒的内部超时期限内未调用 PeekMessage ,则认为该应用程序不响应。IsIconic确定是否将指定窗口最小化 (图标) 。IsProcessDPIAware获取一个值,该值指示当前进程是否为每英寸点数 (dpi 是否) 感知,以便调整 UI 元素的大小以补偿 dpi 设置。IsWindow确定指定的窗口句柄是否标识现有窗口。IsWindowUnicode确定指定的窗口是否为本机 Unicode 窗口。IsWindowVisible检索指定窗口的可见性状态。IsZoomed确定窗口是否处于最大化状态。LockSetForegroundWindow前台进程可以调用 LockSetForegroundWindow 函数来禁用对 SetForegroundWindow 函数的调用。LogicalToPhysicalPoint将窗口中某个点的逻辑坐标转换为物理坐标。MoveWindow更改指定窗口的位置和尺寸。 对于顶级窗口,位置和尺寸相对于屏幕的左上角。 对于子窗口,它们相对于父窗口的工作区的左上角。OpenIcon将最小化 (图标) 窗口还原为其以前的大小和位置;然后激活窗口。PhysicalToLogicalPoint将窗口中某个点的物理坐标转换为逻辑坐标。RealChildWindowFromPoint检索位于指定点处的子窗口的句柄。 搜索仅限于直接子窗口;不搜索孙级和更深层的子窗口。RealGetWindowClass检索指定窗口类型的字符串。RegisterShellHookWindow注册指定的 Shell 窗口,以接收对 Shell 应用程序有用的事件或通知的特定消息。 收到的事件消息只是发送到与指定窗口的桌面关联的 Shell 窗口的消息。 许多消息与调用 SetWindowsHookEx 函数并为挂钩类型指定 符合 _ SHELL 后可接收的消息相同。 与 RegisterShellHookWindow 的不同之处在于,消息是通过指定的窗口的 WindowProc 接收的,而不是通过回拨过程接收的。SetForegroundWindow将创建指定窗口的线程置于前台,并激活窗口。 键盘输入将定向到窗口,并为用户更改各种视觉提示。 系统为创建前台窗口的线程分配比其他线程更高的优先级。SetLayeredWindowAttributes设置分层窗口的不透明度和透明度颜色键。SetParent更改指定子窗口的父窗口。SetProcessDefaultLayout如果创建的窗口不具有父项或当前正在运行的进程的所有者,则更改默认布局。SetProcessDPIAware将当前进程设置为 dpi 感知。SetWindowDisplayAffinity将 "内核模式" 中的显示相关性设置存储在与窗口关联的 hWnd 上。SetWindowPlacement设置指定窗口的显示状态和已还原、最小化和最大化位置。SetWindowPos更改子窗口、弹出窗口或顶级窗口的大小、位置和 Z 顺序。 这些窗口按其在屏幕上的外观进行排序。 最顶部的窗口接收最高排名,是 Z 顺序中的第一个窗口。SetWindowText更改指定窗口标题栏的文本 (如果有一个) 。 如果指定的窗口是控件,则控件的文本将更改。 但是, SetWindowText 无法更改另一应用程序中控件的文本。ShowOwnedPopups显示或隐藏指定窗口所有的弹出窗口。ShowWindow设置指定窗口的显示状态。ShowWindowAsync设置由不同线程创建的窗口的显示状态。卫士触发视觉信号以指示正在播放声音。SwitchToThisWindow将焦点切换到指定窗口并将其置于前台。TileWindows平铺指定的父窗口的指定子窗口。UpdateLayeredWindow更新分层窗口的位置、大小、形状、内容和透明度。UpdateLayeredWindowIndirect更新分层窗口的位置、大小、形状、内容和透明度。WindowFromPhysicalPoint检索包含指定物理点的窗口的句柄。WindowFromPoint检索包含指定点的窗口的句柄。WinMainWinMain是用户提供的用于基于 Windows 的应用程序的入口点的传统名称。 窗口宏 名称说明获取 _ X _ LPARAM从给定的 LPARAM 值检索有符号的 x 坐标。获取 _ Y _ LPARAM从给定的 LPARAM 值检索有符号的 y 坐标。HIBYTE从给定的16位值检索高序位字节。HIWORD检索给定32位值的高序位字。LOBYTE从指定的值中检索低序位字节。LOWORD检索指定值中的低序位字。MAKELONG通过连接指定的值创建一个 长整型 值。MAKELPARAM创建一个值,用作消息中的 lParam 参数。 宏将指定的值连接在一起。MAKELRESULT创建一个值,用作窗口过程中的返回值。 宏将指定的值连接在一起。MAKEWORD通过连接指定的值创建一个 单词 值。MAKEWPARAM创建一个值,用作消息中的 wParam 参数。 宏将指定的值连接在一起。 窗口消息 名称说明MN _ GETHMENU获取当前窗口的 HMENU 。WM _ IVSFONTANDCOLORSTORAGE.GETFONT 错误检索控件当前在绘制其文本时所用的字体。WM _ GETTEXT将与窗口对应的文本复制到调用方所提供的缓冲区中。WM _ GETTEXTLENGTH确定与窗口关联的文本的长度(以字符为字符)。WM _ SETFONT指定控件在绘制文本时使用的字体。WM _ SETICON将新的大图标或小图标与窗口关联。 系统将在 "ALT + TAB" 对话框中显示大图标,并在窗口标题中显示小图标。WM _ SETTEXT设置窗口的文本。 窗口通知 名称说明WM _ ACTIVATEAPP当要激活的窗口属于与活动窗口不同的应用程序时发送。 消息将发送到其窗口被激活的应用程序,以及要停用其窗口的应用程序。 窗口通过其 WindowProc 函数接收此消息。WM _ CANCELMODE发送以取消某些模式,如鼠标捕获。 例如,当显示对话框或消息框时,系统会将此消息发送到活动窗口。 某些函数也会将此消息显式发送到指定的窗口,而不管它是否是活动窗口。 例如, EnableWindow 函数在禁用指定窗口时会发送此消息。WM _ CHILDACTIVATE当用户单击窗口的标题栏或窗口被激活、移动或调整大小时发送到子窗口。WM _ 关闭发送为窗口或应用程序应终止的信号。WM _ 压缩当系统检测到超过30到60秒间隔的系统时间超过12.5% 时,将发送到所有顶级窗口。 这表明系统内存不足。WM _ 创建当应用程序请求通过调用 CreateWindowEx 或 CreateWindow 函数创建窗口时发送。 (在函数返回之前发送消息。 ) 新窗口的窗口过程在窗口创建之后但在窗口变为可见之前接收此消息。WM _ 销毁当窗口被销毁时发送。 在窗口从屏幕中删除后,它会被发送到窗口的窗口过程。 此消息首先发送到正在销毁的窗口,然后发送到子窗口 (如果任何) 被销毁。 在处理消息的过程中,可以假定所有子窗口仍然存在。WM _ 启用当应用程序更改窗口的启用状态时发送。 它将发送到已启用状态正在更改的窗口。 此消息将在 EnableWindow 函数返回之前发送,但在启用状态之后,窗口的 (WS _ 禁用 样式位) 已更改。WM _ ENTERSIZEMOVE在窗口进入移动或大小调整模式循环后向窗口发送一次。 当用户单击窗口的标题栏或大小调整边框时,或者当窗口将 WM _ SYSCOMMAND 消息传递给 DefWindowProc 函数,并且消息的 wParam 参数指定了 sc _ MOVE 或 sc _ SIZE 值时,该窗口将进入移动或调整大小模式循环。 当 DefWindowProc 返回时,操作完成。 不管是否启用了整个窗口的拖动,系统都将发送 WM _ ENTERSIZEMOVE 消息。WM _ ERASEBKGND当必须清除窗口背景时发送 (例如,在调整窗口大小时) 。 发送消息以准备用于绘制的窗口的无效部分。WM _ EXITSIZEMOVE在退出移动或大小调整模式循环后向窗口发送一次。 当用户单击窗口的标题栏或调整大小边框时,或当窗口将 WM _ SYSCOMMAND 消息传递给 DefWindowProc 函数,并且消息的 wParam 参数指定了 sc _ MOV E 或 sc _ SIZE 值时,窗口将进入移动或调整大小模式循环。 当 DefWindowProc 返回时,操作完成。WM _ GETICON发送到窗口以检索与窗口关联的大图标或小图标的句柄。 系统将在 "ALT + TAB" 对话框中显示大图标,并在窗口标题中显示小图标。WM _ GETMINMAXINFO当窗口的大小或位置即将发生更改时发送给窗口。 应用程序可以使用此消息替代窗口的默认最大大小和位置,或者其默认的最小值或最大跟踪大小。WM _ INPUTLANGCHANGE在应用程序的输入语言被更改后发送到最顶层的受影响窗口。 应进行任何特定于应用程序的设置,并将消息传递给 DefWindowProc 函数,该函数将消息传递到所有第一级子窗口。 这些子窗口可以将消息传递给 DefWindowProc ,以使其将消息传递到其子窗口等。WM _ INPUTLANGCHANGEREQUEST当用户选择新的输入语言(使用键盘控制面板应用程序中指定的热键 () 或系统任务栏上的指示器)时,已发布到该窗口。 应用程序可以接受更改,方法是将消息传递到 DefWindowProc 函数或拒绝更改 (并通过立即返回来阻止其发生) 。WM _ 移动在窗口移动后发送。WM _ 移动发送到用户正在移动的窗口。 通过处理此消息,应用程序可以监视拖动矩形的位置,并根据需要更改其位置。WM _ NCACTIVATE当需要更改其非工作区以指示活动或非活动状态时发送给窗口。WM _ NCCALCSIZE当必须计算窗口工作区的大小和位置时发送。 通过处理此消息,当窗口的大小或位置发生更改时,应用程序可以控制窗口的工作区的内容。WM _ NCCREATE当首次创建窗口时,在 WM _ CREATE 消息之前发送。WM _ NCDESTROY通知窗口其非工作区正在被销毁。 DestroyWindow函数按照 wm _ 销毁消息将 wm _ NCDESTROY消息发送到窗口。 WM _销毁 用于释放与窗口关联的分配的内存对象。 在子窗口销毁后,将发送 WM _ NCDESTROY 消息。 与此相反,在销毁子窗口之前发送了 WM _ 销毁 。WM _ NULL不执行任何操作。 如果某个应用程序要发布接收方窗口将忽略的消息,则该应用程序将发送 一条一 _ 条消息。WM _ PARENTNOTIFY在创建或销毁子窗口时,或当用户在光标位于子窗口上并且用户单击鼠标按钮时发送到子窗口的父窗口。 创建子窗口后,系统就会在创建该窗口的 CreateWindow或 CreateWindowEx函数之前发送 WM _ PARENTNOTIFY 。 销毁子窗口后,系统会在进行任何处理以销毁窗口之前发送消息。WM _ QUERYDRAGICON发送到最小化的 (图标) 窗口。 窗口即将被用户拖动,但没有为类定义的图标。 应用程序可以返回图标或光标的句柄。 用户拖动图标时,系统将显示此光标或图标。WM _ QUERYOPEN当用户请求将窗口还原到其以前的大小和位置时发送到图标。WM _ QUIT指示终止应用程序的请求,在应用程序调用 PostQuitMessage 函数时生成。 这会导致 GetMessage 函数返回零。WM _ SHOWWINDOW当窗口即将隐藏或显示时发送到窗口。WM _ 大小在窗口的大小更改后发送到窗口。WM _ 大小调整发送到用户正在调整大小的窗口。 通过处理此消息,应用程序可以监视拖动矩形的大小和位置,并根据需要更改其大小或位置。WM _ STYLECHANGED在 SetWindowLong 函数更改了窗口的一个或多个样式后,将 Ssent 到窗口。WM _ STYLECHANGINGSetWindowLong函数即将更改窗口的一个或多个样式时发送到窗口。WM _ THEMECHANGED广播到主题更改事件后每个窗口。 主题更改事件的示例包括激活主题、停用主题或从一个主题转换到另一个主题。WM _ USERCHANGED在用户登录或关闭后发送到所有窗口。 当用户登录或注销时,系统将更新特定于用户的设置。 系统在更新设置后立即发送此消息。WM _ WINDOWPOSCHANGED发送到其大小、位置或位置在 Z 顺序中已更改的窗口,因为调用 SetWindowPos 函数或其他窗口管理函数。WM _ WINDOWPOSCHANGING发送到其大小、位置或位置在 Z 顺序中即将因调用 SetWindowPos 函数或其他窗口管理函数而更改的窗口。 窗口结构 名称说明ALTTABINFO包含"ALT+TAB"窗口 (应用程序切换) 信息。CHANGEFILTERSTRUCT包含通过调用 ChangeWindowMessageFilterEx 函数获取的扩展结果 信息。CLIENTCREATESTRUCT包含有关 MDI 客户端窗口的子窗口 (MDI) 菜单和第一个多文档界面的信息。 应用程序在创建 MDI 客户端窗口时,将指针作为 CreateWindow函数的 lpParam 参数传递给此结构。CREATESTRUCT定义传递给应用程序的窗口过程初始化参数。 这些成员与 CreateWindowEx 函数的参数相同。GUITHREADINFO包含有关 GUI 线程的信息。MINMAXINFO包含有关窗口的最大化大小和位置及其最小和最大跟踪大小的信息。NCCALCSIZE _ PARAMS包含应用程序在处理 WM _ NCCALCSIZE 消息时可用于计算窗口工作区的大小、位置和有效内容的信息。STYLESTRUCT包含窗口的样式。TITLEBARINFO包含标题栏信息。TITLEBARINFOEX通过包括标题栏的每个元素的坐标,展开 TITLEBARINFO 结构中所述的信息。UPDATELAYEREDWINDOWINFO由 UpdateLayeredWindowIndirect 用来提供分层窗口的位置、大小、形状、内容和半透明性信息。WINDOWINFO包含窗口信息。WINDOWPLACEMENT包含有关窗口在屏幕上的位置的信息。WINDOWPOS包含有关窗口大小和位置的信息。 窗口常量 名称说明扩展窗口样式可在需要扩展窗口样式的位置指定样式。窗口样式可在任何需要窗口样式的位置指定样式。 创建控件后,无法修改这些样式,除非已说明。转自:窗口(窗口和消息) - Win32 apps | Microsoft Docs