我有以下使用模块win32gui调用EnumChildWindows函数的工作 Python 代码:import win32guidef func(hwnd, param): param.append(hwnd) return Truedef code(): arr = [] win32gui.EnumChildWindows(win32gui.GetDesktopWindow(), func, arr) print(arr)code()win32gui.EnumChildWindows允许通过引用传递最后一个参数中的任何 Python 对象。我正在尝试使用 module 做同样的事情ctypes。我得到的最接近的是传递一个 C 数组而不是 Python 列表,尽管它不是通过引用传递,因为当我在函数内部更改变量时,它不会在外部更改它的值。代码如下:from ctypes import byref, POINTER, windll, WINFUNCTYPEfrom ctypes.wintypes import BOOL, HWND, LPARAMdef func(hwnd, param): c_arr = HWND * (len(param) + 1) param = c_arr(*param) param[len(param) - 1] = hwnd print(str(param[len(param) - 1])) return Truedef code(): py_arr = [] c_arr = HWND * len(py_arr) arr = c_arr(*py_arr) WNDENUMPROC = WINFUNCTYPE(BOOL, HWND, HWND * len(py_arr)) windll.user32.EnumChildWindows.argtypes = [HWND, WNDENUMPROC, POINTER(HWND * len(py_arr))] windll.user32.EnumChildWindows.restype = BOOL windll.user32.EnumChildWindows(windll.user32.GetDesktopWindow(), WNDENUMPROC(func), byref(arr)) print(arr)code()
1 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
win32gui
经过一段时间的搜索和尝试不同的东西,我找到了C 中的代码。
它使用对应于ctypes.py_object
.
工作代码如下:
from ctypes import byref, py_object, windll, WINFUNCTYPE
from ctypes.wintypes import BOOL, HWND
def func(hwnd, param):
param.append(hwnd)
return True
def code():
arr = []
WNDENUMPROC = WINFUNCTYPE(BOOL, HWND, py_object)
windll.user32.EnumChildWindows.argtypes = [HWND, WNDENUMPROC, py_object]
windll.user32.EnumChildWindows.restype = BOOL
windll.user32.EnumChildWindows(windll.user32.GetDesktopWindow(), WNDENUMPROC(func), arr)
print(arr)
code()
添加回答
举报
0/150
提交
取消