Sno*_*all 6 python winapi pywin32 z-order
有没有办法使用Python Windows 扩展来获取窗口的 z 顺序?或者,有没有办法使用另一个模块来做到这一点?通常的方法是使用GetTopWindowand GetNextWindow,但这些函数都没有出现在win32gui模块中。
目前我正在这样做,但它没有考虑到 Windows 的 z 顺序:
import win32gui
def get_windows():
def callback(hwnd, lst):
lst.append(hwnd)
lst = []
win32gui.EnumWindows(callback, lst)
return lst
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要这样的东西:(这不起作用)
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
Run Code Online (Sandbox Code Playgroud)
但是,缺少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
Run Code Online (Sandbox Code Playgroud)
尸检。
PyWin32的当前URL:[GitHub]:mhammond/pywin32 - pywin32。
关于CTypes替代方案:
可能应该发布在答案而不是问题中
包含一个可能造成灾难性后果的常见缺陷。检查[SO]:通过 ctypes 从 Python 调用的 C 函数返回不正确的值(@CristiFati 的答案)以了解详细信息
关于PyWin32实现,考虑到它不包含错误(我没有检查):
[MS.Docs]:GetNextWindow 宏 (winuser.h)(如URL文本所述)是GetWindow的#define,而不是函数,这一事实在提问时就已知晓(因为CTypes实现使用后者),因此win32gui可以使用.GetWindow(至少在最新的PyWin32版本中)
我刚刚提交了[GitHub]:mhammond/pywin32 - win32gui 中的更多窗口函数(合并到220822上的main)。检查[SO]:如何使用 python & win32print 更改打印队列中的作业用户名(@CristiFati 的答案),了解有关如何从此类补丁中受益的详细信息。本地构建示例:
Run Code Online (Sandbox Code Playgroud)[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
| 归档时间: |
|
| 查看次数: |
1984 次 |
| 最近记录: |