我有以下使用模块win32gui调用EnumChildWindows函数的工作 Python 代码:
import win32gui
def func(hwnd, param):
param.append(hwnd)
return True
def code():
arr = []
win32gui.EnumChildWindows(win32gui.GetDesktopWindow(), func, arr)
print(arr)
code()
win32gui.EnumChildWindows允许通过引用传递最后一个参数中的任何 Python 对象。
我正在尝试使用 module 做同样的事情ctypes。我得到的最接近的是传递一个 C 数组而不是 Python 列表,尽管它不是通过引用传递,因为当我在函数内部更改变量时,它不会在外部更改它的值。
代码如下:
from ctypes import byref, POINTER, windll, WINFUNCTYPE
from ctypes.wintypes import BOOL, HWND, LPARAM
def 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 True
def 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()
扬帆大鱼
相关分类