如何使用 ctypes 模块通过引用 EnumChildWindows 将 Python 列表作为

我有以下使用模块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()


HUH函数
浏览 120回答 1
1回答

扬帆大鱼

win32gui经过一段时间的搜索和尝试不同的东西,我找到了C 中的代码。它使用对应于ctypes.py_object.工作代码如下:from ctypes import byref, py_object, windll, WINFUNCTYPEfrom ctypes.wintypes import BOOL, HWNDdef func(hwnd, param):  param.append(hwnd)  return Truedef 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python