#Python3中pywin32中常用代码解释

Python3中pywin32中常用代码解释

摘要
本文介绍 Win32 版本的 Microsoft Windows 操作系统提供的桌面窗口、顶层窗口和子窗口,以及它们之间的层级关系;解释了应用程序如何游历窗口结构,如何控制桌面上显示的窗口的样式和外观。

窗口层级
在 Microsoft Windows 图形环境中,用来显示信息的最基本元件是窗口。一个窗口和其它窗口之间的关系包括可见性关系、拥有关系和父/子关系,由 Microsoft Windows 管理这些关系。当创建、销毁或者显示一个窗口时,Windows 要用到这种关系信息。Windows 的窗口管理器控制着一个窗口如何和另一个窗口关联,并把每个窗口的窗口进程信息连接起来形成一张层级表,即 window manager’s list 。

窗口管理器使用每个窗口的进程信息结构中的四个元素来构建窗口管理器列表:

•本窗口子窗口的句柄
•子窗口列表中下一个子窗口的句柄 (本窗口的下一兄弟)
•本窗口父窗口的句柄
•本窗口拥有者的句柄

图1.

在初始化 Windows 的时候创建 desktop window,桌面窗口的大小被调整为可以覆盖整个显示区域。窗口管理器把桌面窗口放在窗口管理器列表的顶层。因此,桌面窗口位于窗口层级的顶层。

窗口层级中下一层的窗口叫做 top-level window。一个窗口只要不是子窗口,就是顶层窗口。顶层窗口没有 WS_CHILD 样式。窗口管理器填写每个顶层窗口的下一窗口句柄,把所有的顶层窗口连成一张链表,然后把此链表的表头存储在桌面窗口的子窗口句柄中。这样就建立了顶层窗口和桌面窗口的联系。这个链表被称为 child window list,因为它连接到一个窗口的子窗口句柄。一张子窗口列表中的所有窗口相互间都是兄弟,因此所有顶层窗口互为兄弟。子窗口列表中各元素的顺序决定了它们的Z序,列表中的第一个在Z序的顶端,列表中的最后一个在Z序的底端。窗口管理器依此Z序决定哪个窗口或窗口的哪个部分可见,哪个窗口或窗口的哪个部分被其它窗口盖住。如果一个窗口A出现在另一个窗口B的下面,那么在子窗口列表中 A 位于 B 之后。

所有顶层窗口也通过自己窗口进程信息的父窗口句柄同桌面窗口连接。顶层窗口通过这种方式和桌面窗口连接,就好像它们是桌面窗口的子窗口一样。在游历父/子关系的技术中,确实可以把顶层窗口当作桌面窗口的子窗口。

顶层窗口在创建时,被窗口管理器放到Z序的顶端,因此整个窗口都是可见的。窗口管理器把这个窗口放到桌面窗口的子窗口列表的顶部。有个扩展样式,WS_EX_TOPMOST,可以控制窗口管理器把最近创建的窗口放到窗口管理器列表的哪个部分。所有不包含 WS_EX_TOPMOST 样式的窗口都被窗口管理器放到包含 WS_EX_TOPMOST 样式的窗口之后。因此所有具有 WS_EX_TOPMOST 样式的窗口总是显示在不具有 WS_EX_TOPMOST 样式的窗口前面。

图2.

另一种类型的关系,可以存在于顶层窗口之间:顶层窗口可以拥有其它顶层窗口、或者被其它顶层窗口拥有。一个被拥有的窗口在Z序上总是高于它的拥有者窗口;在它的拥有者最小化时,它总是被隐藏。但是如果它的拥有者被隐藏,这个被拥有的窗口并不会隐藏。因此,如果窗口A拥有窗口B,窗口B又拥有窗口C,当窗口A最小化时,窗口B将被隐藏,而窗口C保持可见。在调用 CreateWindow(或者 CreateWindowEx)创建窗口的时候,给 hwndParent 参数指定一个窗口句柄,这样就指定了被创建的窗口的拥有者。如果 hwndParent 参数指定的窗口不是顶层窗口,Windows 查找此参数指向的窗口的顶层窗口,将找到的顶层窗口作为拥有者。这个被拥有的窗口创建以后,hwndParent 参数指定的窗口存储在窗口进程信息的父窗口字段;作为拥有者的顶层窗口存储在窗口进程信息的拥有者字段。如果应用程序在创建对话框的时候没有特别声明此对话框要是一个子窗口,Windows 将创建一个被拥有的对话框。

图3.

桌面窗口占据着窗口层级的第一层,顶层窗口位于第二层。Child window,即那些创建时带有 WS_CHILD 样式的窗口,位于所有的其它层级。窗口管理器将子窗口同它们的父窗口连接起来的方式和将顶层窗口和桌面窗口连接起来的方式一样。

图4.

子窗口显示在它们父窗口的客户区。窗口管理器使用子窗口列表中从头到尾的顺序来决定子窗口们的Z序。这和用来决定顶层窗口的Z序的方法是一样的。所有顶层窗口都显示在桌面窗口的客户区,因此,看起来就好像它们是桌面的子窗口。

Win32 中有什么不同?
上面介绍的桌面窗口、顶层窗口、被拥有的窗口及子窗口之间的关系,在 Win32 和 Win16 中是一样的。这保证了 Win32 和 Win16 之间的高度兼容,使用窗口层级的应用程序在这两种环境下都能工作。Win32 和 Win16 有两点不同:安全性,多线程。

Windows NT 向窗口层级中添加了一个新层级:每一个运行 Wi

你可能感兴趣的:(Python,pywin32中常用代码解释,窗口的句柄获取,WS_EX_TOPMOST,EnumWindows,CreateWindow)