亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號