用Python Windows扩展获取窗口Z顺序
有没有办法通过Python Windows 扩展来获取窗口的层级顺序(z-order)?或者说,是否可以用其他模块来实现这个功能?通常我们会用GetTopWindow
和GetNextWindow
这两个函数来完成,但在win32gui
模块里找不到这两个函数。
现在我正在这样做,但这并没有考虑到窗口的层级顺序:
import win32gui
def get_windows():
def callback(hwnd, lst):
lst.append(hwnd)
lst = []
win32gui.EnumWindows(callback, lst)
return lst
理想情况下,我希望能有这样的功能:(这个方法不行)
import win32gui
import win32con
def get_windows():
'''Returns windows in z-order (top first)'''
lst = []
top = win32gui.GetTopWindow()
if top is None: return lst
lst.append(top)
while True:
next = win32gui.GetNextWindow(lst[-1], win32con.GW_HWNDNEXT)
if next is None: break
lst.append(next)
return lst
不过,GetTopWindow
和GetNextWindow
这两个函数缺失了,所以我无法实现。
更新:
我想我有点太急于寻求帮助了。其实我用ctypes解决了这个问题。希望其他人也能觉得这个信息有用。
import win32con
import ctypes
def get_windows():
'''Returns windows in z-order (top first)'''
user32 = ctypes.windll.user32
lst = []
top = user32.GetTopWindow(None)
if not top:
return lst
lst.append(top)
while True:
next = user32.GetWindow(lst[-1], win32con.GW_HWNDNEXT)
if not next:
break
lst.append(next)
return lst
1 个回答
关于“死贴”的话题。
PyWin32的当前链接是:[GitHub]: mhammond/pywin32 - pywin32。
关于CTypes的替代方案:
这个内容应该放在回答里,而不是问题里。
里面有一个常见的缺陷,可能会导致严重后果。可以查看[SO]: 从Python通过ctypes调用的C函数返回错误值(@CristiFati的回答)了解详细信息。
关于PyWin32的实现,假设它没有错误(我没有检查):
[MS.Docs]: GetNextWindow宏(winuser.h)(正如URL文本所说),是一个#define,而不是一个函数,这个事实在提问时就已经知道了(因为CTypes的实现使用的是后者),所以可以使用win32gui.GetWindow(至少在最新的PyWin32版本中可以使用)。
我刚刚提交了[GitHub]: mhammond/pywin32 - 在win32gui中添加更多窗口函数(在220822合并到main分支)。可以查看[SO]: 如何使用python和win32print更改打印队列中作业的用户名(@CristiFati的回答)了解如何利用这样的补丁。
本地构建示例:[cfati@CFATI-5510-0:e:\Work\Dev\GitHub\CristiFati\pywin32\src\build\lib.win-amd64-3.9\win32]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" -c "import os;os.add_dll_directory(os.path.join(os.path.dirname(os.getcwd()), 'pywin32_system32'));import win32gui as wgui;print(wgui);print('Top window handle: 0x{:016X}'.format(wgui.GetTopWindow(None)))" <module 'win32gui' from 'e:\\Work\\Dev\\GitHub\\CristiFati\\pywin32\\src\\build\\lib.win-amd64-3.9\\win32\\win32gui.pyd'> Top window handle: 0x0000000000020480