为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUH函数 2023-06-06 16:32:48
我有以下使用模块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()


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信