如何使用ctypes模块通过引用向EnumChildWindows发送Python列表作为参数?
我有以下工作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
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()