窗口(窗口和消息)

在基于 Windows 的图形应用程序中,窗口是屏幕的矩形区域,应用程序在其中显示输出并接收用户的输入。 因此,基于 Windows 的图形应用程序的首要任务之一是创建窗口。

窗口与其他窗口共享屏幕,包括来自其他应用程序的窗口。 一次只有一个窗口可以接收来自用户的输入。 用户可以使用鼠标、键盘或其他输入设备与此窗口和拥有它的应用程序进行交互。

本节内容

名称 描述
关于 Windows 描述应用程序用于创建和使用窗口的编程元素;管理窗口之间的关系;以及窗口的大小、移动和显示。
使用 Windows 包含执行与使用窗口相关联任务的示例。
窗口功能 讨论窗口的功能,如窗口类型、状态、大小和位置。
窗口引用 包含 API 引用。

 

窗口函数

名称 描述
AdjustWindowRect 根据所需的客户端矩形大小,计算所需的窗口矩形大小。 然后可以将窗口矩形传递给 CreateWindow 函数,以创建客户端区域为所需大小的窗口。
AdjustWindowRectEx 根据所需的客户端矩形大小,计算所需的窗口矩形大小。 然后可以将窗口矩形传递给 CreateWindowEx 函数,以创建客户端区域为所需大小的窗口。
AllowSetForegroundWindow 允许指定的进程使用 SetForegroundWindow 函数设置前台窗口。 调用进程必须已经能够设置前台窗口。 有关详细信息,请参阅本主题后面的“备注”。
AnimateWindow 允许在显示或隐藏窗口时产生特殊效果。 有四种类型的动画:滚动、滑动、折叠或展开以及 alpha 混合淡化。
AnyPopup 指示屏幕上是否存在拥有的、可见的、顶级弹出窗口或重叠窗口。 函数搜索整个屏幕,而不仅仅是调用应用程序的客户端区域。
ArrangeIconicWindows 排列指定父窗口的所有最小化(标志性)子窗口。
BeginDeferWindowPos 为多窗口位置结构分配内存,并将句柄返回到该结构。
BringWindowToTop 将指定的窗口带到 Z 顺序的顶部。 如果窗口是顶级窗口,则会被激活。 如果窗口是子窗口,则与该子窗口相关联的顶级父窗口将被激活。
CalculatePopupWindowPosition 使用指定的定位点、弹出窗口大小、标志和可选的排除矩形计算适当的弹出窗口位置。 当指定的弹出窗口大小小于桌面窗口大小时,请使用 CalculatePopupWindowPosition 函数确保弹出窗口在桌面窗口上完全可见,而不考虑指定的锚点。
CascadeWindows 层叠指定父窗口的指定子窗口。
ChangeWindowMessageFilter 在用户界面特权隔离 (UIPI) 消息筛选器中添加或删除消息。
ChangeWindowMessageFilterEx 修改指定窗口的 UIPI 消息筛选器。
ChildWindowFromPoint 确定属于父窗口的哪个子窗口(如果有的话)包含指定点。 搜索仅限于直接子窗口。 不搜索后代和更深的后代窗口。
ChildWindowFromPointEx 确定属于指定父窗口的哪个子窗口中(如果有的话)包含指定点。 函数可以忽略不可见、禁用和透明的子窗口。 搜索仅限于直接子窗口。 不会搜索孙级和更深的后代。
CloseWindow 最小化(但不销毁)指定窗口。
CreateWindow 创建重叠窗口、弹出窗口或子窗口。 它指定窗口类、窗口标题、窗口样式以及(可选)窗口的初始位置和大小。 函数还指定窗口的父级或所有者(如有)以及窗口的菜单。
CreateWindowEx 创建具有扩展窗口样式的重叠窗口、弹出窗口或子窗口;否则,此函数与 CreateWindow 函数相同。 有关创建窗口的详细信息以及 CreateWindowEx 其他参数的完整描述,请参阅 CreateWindow
DeferWindowPos 更新指定窗口的指定多窗口位置结构。 然后,函数向更新后的结构返回句柄。 EndDeferWindowPos 函数使用此结构中的信息同时更改多个窗口的位置和大小。 BeginDeferWindowPos 函数创建结构。
DeregisterShellHookWindow 注销为接收 Shell 挂钩消息而注册的指定 Shell 窗口。 它注销通过调用 RegisterShellHookWindow 函数注册的窗口。
DestroyWindow 销毁指定窗口。 函数向窗口发送 WM_DESTROYWM_NCDESTROY 消息,以停用窗口并删除窗口中的键盘焦点。 函数还会销毁窗口的菜单,刷新线程消息队列,破坏计时器,移除剪贴板所有权,并断开剪贴板查看器链(如果窗口位于查看器链的顶部)。
EndDeferWindowPos 在单一屏幕刷新周期中同时更新一个或多个窗口的位置和大小。
EndTask 强制关闭指定窗口。
EnumChildProc EnumChildWindows 函数一起使用的应用程序定义的回调函数。 它接收子窗口句柄。 WNDENUMPROC 类型定义了指向此回调函数的指针。 EnumChildProc 是应用程序定义的函数名称的占位符。
EnumChildWindows 通过将句柄传递给每个子窗口,进而传递给应用程序定义的回调函数,枚举属于指定父窗口的子窗口。 EnumChildWindows 继续,直到枚举最后一个子窗口或回调函数返回 FALSE
EnumThreadWindows 通过将句柄传递给每个窗口,进而传递给应用程序定义的回调函数,枚举与线程关联的所有非子窗口。 EnumThreadWindows 继续,直到枚举最后一个窗口或回调函数返回 FALSE。 要枚举特定窗口的子窗口,请使用 EnumChildWindows 函数。
EnumThreadWndProc EnumThreadWindows 函数一起使用的应用程序定义的回调函数。 它接收与线程相关联的窗口句柄。 WNDENUMPROC 类型定义了指向此回调函数的指针。 EnumThreadWndProc 是应用程序定义的函数名称的占位符。
EnumWindows 通过将句柄传递给每个窗口,依次传递给应用程序定义的回调函数,枚举屏幕上的所有顶级窗口。 EnumWindows 继续,直到枚举最后一个顶级窗口或回调函数返回 FALSE
EnumWindowsProc EnumWindowsEnumDesktopWindows 函数一起使用的应用程序定义的回调函数。 它接收顶级窗口句柄。 WNDENUMPROC 类型定义了指向此回调函数的指针。 EnumWindowsProc 是应用程序定义的函数名称的占位符。
FindWindow 检索其类名和窗口名与指定字符串匹配的顶级窗口的句柄。 此函数不搜索子窗口。 此函数不执行区分大小写的搜索。
FindWindowEx 检索类名和窗口名与指定字符串匹配的窗口的句柄。 函数搜索子窗口,从指定子窗口后面的子窗口开始。 此函数不执行区分大小写的搜索。
GetAltTabInfo 如果指定的窗口是应用程序切换 (ALT+TAB) 窗口,则检索该窗口的状态信息。
GetAncestor 检索指定窗口的上级句柄。
GetClientRect 检索窗口的客户端区域坐标。 客户端坐标指定工作区的左上角和右下角。 因为客户端坐标相对于窗口的客户端区域的左上角,所以左上角的坐标为 (0,0)。
GetDesktopWindow 返回桌面窗口的句柄。 桌面窗口覆盖整个屏幕。 桌面窗口是在其顶部绘制其他窗口的区域。
GetForegroundWindow 返回前台窗口(用户当前使用的窗口)的句柄。 系统为创建前台窗口的线程分配的优先级略高于其他线程。
GetGUIThreadInfo 检索有关活动窗口或指定 GUI 线程的信息。
GetLastActivePopup 确定指定窗口所拥有的弹出窗口最近处于活动状态。
GetLayeredWindowAttributes 检索分层窗口的不透明度和透明度颜色键。
GetNextWindow 检索 Z 顺序中下一个或上一个窗口的句柄。 下一个窗口位于指定窗口的下方;上一个窗口在上面。 如果指定的窗口是最顶层的窗口,则函数将检索下一个(或上一个)最顶层窗口的句柄。 如果指定的窗口是顶级窗口,则函数将检索下一个(或上一个)顶级窗口的句柄。 如果指定的窗口是子窗口,则函数将搜索下一个(或上一个)子窗口的句柄。
GetParent 检索指定窗口的父级或所有者的句柄。
GetProcessDefaultLayout 检索在没有父级或所有者的情况下创建窗口时使用的默认布局。
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 函数并为挂钩类型指定 WH_SHELL 后可以接收到的消息相同。 与 RegisterShellHookWindow 的区别在于,消息是通过指定窗口的 WindowProc 接收的,而不是通过回调过程接收的。
SetForegroundWindow 将创建指定窗口的线程放到前台并激活该窗口。 键盘输入将定向到窗口,并为用户更改各种视觉提示。 系统为创建前台窗口的线程分配的优先级略高于其他线程。
SetLayeredWindowAttributes 设置分层窗口的不透明度和透明度颜色键。
SetParent 更改指定子窗口的父窗口。
SetProcessDefaultLayout 当仅为当前运行的进程创建没有父级或所有者的窗口时,更改默认布局。
SetProcessDPIAware 将当前进程设置为 dpi 感知。
SetWindowDisplayAffinity 将内核模式下的显示相关性设置存储在与窗口相关联的 hWnd 上。
SetWindowPlacement 设置指定窗口的显示状态以及恢复、最小化和最大化的位置。
SetWindowPos 更改子窗口、弹出窗口或顶级窗口的大小、位置和 Z 顺序。 这些窗口是根据它们在屏幕上的外观排列的。 最上方的窗口接收最高排名,并且是 Z 顺序中的第一个窗口。
SetWindowText 更改指定窗口标题栏的文本(如有)。 如果指定的窗口是控件,则该控件的文本将发生更改。 但是,SetWindowText 无法更改其他应用程序中控件的文本。
ShowOwnedPopups 显示或隐藏指定窗口所拥有的所有弹出窗口。
ShowWindow 设置指定窗口的显示状态。
ShowWindowAsync 设置由其他线程创建的窗口的显示状态。
SoundSentry 触发视觉信号以指示正在播放声音。
SwitchToThisWindow 将焦点切换到指定的窗口并将其置于前台。
TileWindows 平铺指定父窗口的指定子窗口。
UpdateLayeredWindow 更新分层窗口的位置、大小、形状、内容和透明度。
UpdateLayeredWindowIndirect 更新分层窗口的位置、大小、形状、内容和透明度。
WindowFromPhysicalPoint 检索包含指定物理点的窗口句柄。
WindowFromPoint 检索包含指定点的窗口句柄。
WinMain WinMain 是基于 Windows 的应用程序的用户提供的入口点常规名称。

 

窗口宏

名称 描述
GET_X_LPARAM 从给定的 LPARAM 值中检索带符号的 x 坐标。
GET_Y_LPARAM 从给定的 LPARAM 值中检索带符号的 y 坐标。
HIBYTE 从给定的 16 位值中检索高序字节。
HIWORD 从给定的 32 位值中检索高序字。
LOBYTE 从指定值检索低序字节。
LOWORD 从指定值检索低序字。
MAKELONG 通过串联指定的值来创建 LONG 值。
MAKELPARAM 创建值,用作消息中的 lParam 参数。 宏连接指定的值。
MAKELRESULT 创建值,用作窗口程序的返回值。 宏连接指定的值。
MAKEWORD 通过连接指定的值来创建 WORD 值。
MAKEWPARAM 创建值,用作消息中的 wParam 参数。 宏连接指定的值。

 

窗口消息

名称 描述
MN_GETHMENU 获取当前窗口的 HMENU
WM_GETFONT 检索控件当前绘制文本时使用的字体。
WM_GETTEXT 将与窗口相对应的文本复制到调用方提供的缓冲区中。
WM_GETTEXTLENGTH 确定与窗口关联的文本的长度(以字符为单位)。
WM_SETFONT 指定控件在绘制文本时要使用的字体。
WM_SETICON 将新的大图标或小图标与窗口相关联。 系统在 ALT+TAB 对话框中显示大图标,在窗口标题中显示小图标。
WM_SETTEXT 设置窗口的文本。

 

窗口通知

名称 描述
WM_ACTIVATEAPP 当属于与活动窗口不同的应用程序的窗口即将被激活时发送。 消息被发送到其窗口被激活的应用程序和其窗口遭停用的应用程序。
窗口通过其 WindowProc 函数接收此消息。
WM_CANCELMODE 发送以取消某些模式,如鼠标捕捉。 例如,当显示对话框或消息框时,系统会将此消息发送到活动窗口。 某些函数也会将此消息显式发送到指定的窗口,而不管它是否为活动窗口。 例如,EnableWindow 函数在禁用指定窗口时发送此消息。
WM_CHILDACTIVATE 当用户单击窗口的标题栏或激活、移动或调整窗口大小时,发送到子窗口。
WM_CLOSE 作为窗口或应用程序应终止的信号发送。
WM_COMPACTING 当系统在 30 到 60 秒的时间间隔内检测到超过 12.5% 的系统时间用于压缩内存时,发送到所有顶级窗口。 这指示系统内存不足。
WM_CREATE 当应用程序请求通过调用 CreateWindowExCreateWindow 函数创建窗口时发送。 (该消息在函数返回之前发送。)新窗口的窗口程序在创建窗口之后但在窗口变为可见之前接收此消息。
WM_DESTROY 在窗口遭销毁时发送。 将窗口从屏幕上移除后,它将被发送到被销毁窗口的窗口程序。
此消息首先发送到要销毁的窗口,然后在销毁时发送到子窗口(如有)。 在处理消息的过程中,可以假设所有子窗口仍然存在。
WM_ENABLE 当应用程序更改窗口的启用状态时发送。 它被发送到启用状态正在更改的窗口。 此消息在 EnableWindow 函数返回之前发送,但在窗口的启用状态(WS_DISABLED 样式位)更改之后发送。
WM_ENTERSIZEMOVE 在窗口进入移动或调整模式循环后发送到窗口一次。 当用户单击窗口的标题栏或大小调整边框时,或者当窗口将 WM_SYSCOMMAND 消息传递给 DefWindowProc 函数并且消息的 wParam 参数指定 SC_MOVESC_SIZE 值时,窗口将进入移动或大小调整模式循环。 当 DefWindowProc 返回时,操作就完成了。
无论是否启用拖动完整窗口,系统都会发送 WM_ENTERSIZEMOVE 消息。
WM_ERASEBKGND 在必须清除窗口背景时发送(例如,调整窗口大小时)。 发送该消息是为了准备用于绘制的窗口的无效部分。
WM_EXITSIZEMOVE 在窗口退出移动或调整模式循环后,向窗口发送一次。 当用户单击窗口的标题栏或大小调整边框时,或者当窗口将 WM_SYSCOMMAND 消息传递给 DefWindowProc 函数并且消息的 wParam 参数指定 SC_MOVE 或 SC_SIZE 值时,窗口将进入移动或大小调整模式循环。 当 DefWindowProc 返回时,操作就完成了。
WM_GETICON 发送到窗口以检索与窗口关联的大图标或小图标的句柄。 系统在 ALT+TAB 对话框中显示大图标,在窗口标题中显示小图标。
WM_GETMINMAXINFO 当窗口的大小或位置即将更改时发送到窗口。 应用程序可以使用此消息覆盖窗口的默认最大大小和位置,或其默认的最小或最大跟踪大小。
WM_INPUTLANGCHANGE 在应用程序的输入语言被更改后发送给最顶层的受影响窗口。 应进行任何特定于应用程序的设置并将消息传递给 DefWindowProc 函数,该函数会将该消息传递到所有第一级子窗口。 这些子窗口可以将消息传递给 DefWindowProc,让它将消息传递给这些子窗口的子窗口,依此类推。
WM_INPUTLANGCHANGEREQUEST 当用户使用热键(在键盘控制面板应用程序中指定)或从系统任务栏上的指示器选择新的输入语言时,发布到带有焦点的窗口。 应用程序可以通过将消息传递给 DefWindowProc 函数来接受更改,也可以通过立即返回来拒绝更改(并阻止更改发生)。
WM_MOVE 在移动窗口后发送。
WM_MOVING 发送到用户正在移动的窗口。 通过处理此消息,应用程序可以监视拖动矩形的位置,并在需要时更改其位置。
WM_NCACTIVATE 当窗口的非客户端区域需要更改以指示活动或非活动状态时,发送到窗口。
WM_NCCALCSIZE 当必须计算窗口的客户端区域的大小和位置时发送。 通过处理此消息,当窗口的大小或位置发生变化时,应用程序可以控制窗口客户端区域的内容。
WM_NCCREATE 首次创建窗口时,在 WM_CREATE 消息之前发送。
WM_NCDESTROY 通知窗口其非客户端区域正在遭损毁。 DestroyWindow 函数将 WM_NCDESTROY 消息发送到 WM_DESTROY 消息之后的窗口。 WM_DESTROY 用于释放与窗口相关联的已分配内存对象。
WM_NCDESTROY 消息是在子窗口遭损毁后发送的。 相反,WM_DESTROY 是在子窗口遭销毁之前发送的。
WM_NULL 不执行任何操作。 如果应用程序想要发布收件人窗口将忽略的消息,则它会发送 WM_NULL 消息。
WM_PARENTNOTIFY 当创建或销毁子窗口时,或者当用户在子窗口上单击鼠标按钮时,发送给子窗口的父窗口。 创建子窗口时,系统会在创建窗口的 CreateWindowCreateWindowEx 函数之前发送 WM_PARENTNOTIFY。 在销毁子窗口时,系统会在进行任何处理来销毁窗口之前发送消息。
WM_QUERYDRAGICON 发送到最小化(标志性)窗口。 窗口即将被用户拖动,但没有为其类定义图标。 应用程序可以返回图标或光标的句柄。 当用户拖动图标时,系统会显示此光标或图标。
WM_QUERYOPEN 当用户请求将窗口恢复到以前的大小和位置时,发送到图标。
WM_QUIT 指示终止应用程序的请求,其是在应用程序调用 PostQuitMessage 函数时生成的。 它会导致 GetMessage 函数返回零。
WM_SHOWWINDOW 在窗口即将隐藏或显示时发送到该窗口。
WM_SIZE 在窗口大小发生更改后发送到窗口。
WM_SIZING 发送到用户正在调整大小的窗口。 通过处理此消息,应用程序可以监视拖动矩形的大小和位置,并根据需要更改其大小或位置。
WM_STYLECHANGED SetWindowLong 函数更改了窗口的一个或多个样式后,转移到窗口。
WM_STYLECHANGING SetWindowLong 函数要更改窗口的一个或多个样式时发送到窗口。
WM_THEMECHANGED 在主题更改事件之后向每个窗口广播。 主题变化事件的例子包括激活主题、停用主题或从一个主题过渡到另一个主题。
WM_USERCHANGED 在用户登录或注销后发送给所有窗口。 当用户登录或注销时,系统会更新用户特定的设置。 系统在更新设置后立即发送此消息。
WM_WINDOWPOSCHANGED 发送到由于调用 SetWindowPos 函数或其他窗口管理函数而导致其大小、位置或在 Z 顺序中的位置发生变化的窗口。
WM_WINDOWPOSCHANGING 发送到由于调用 SetWindowPos 函数或其他窗口管理函数而导致其大小、位置或在 Z 顺序中的位置即将更改的窗口。

 

窗口结构

名称 描述
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 包含有关窗口大小和位置的信息。

 

窗口常量

名称 描述
扩展的窗口样式 可以在需要扩展窗口样式的任何位置指定样式。
窗口样式 可以在需要窗口样式的任何位置指定的样式。 创建控件后,这些样式无法修改,除非另有说明。