Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ctypes模块通过引用向EnumChildWindows发送Python列表作为参数?_Python_Winapi_Ctypes_Pywin32_Win32gui - Fatal编程技术网

如何使用ctypes模块通过引用向EnumChildWindows发送Python列表作为参数?

如何使用ctypes模块通过引用向EnumChildWindows发送Python列表作为参数?,python,winapi,ctypes,pywin32,win32gui,Python,Winapi,Ctypes,Pywin32,Win32gui,我有以下工作Python代码,它使用模块win32gui调用EnumChildWindows函数: import win32gui def func(hwnd, param): param.append(hwnd) return True def code(): arr = [] win32gui.EnumChildWindows(win32gui.GetDesktopWindow(), func, arr) print(arr) code() win32gui.En

我有以下工作Python代码,它使用模块
win32gui
调用
EnumChildWindows
函数:

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对象

我正试图用这个模块做同样的事情。我得到的最接近的结果是传递一个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()
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()

经过一段时间的搜索和尝试,我在C中找到了的代码

它使用对应于的

工作代码如下:

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()
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()