我有以下使用模塊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()
添加回答
舉報
0/150
提交
取消