Always declare .argtypes
and .restype
. It helps check for errors. You can also "fudge" the types if they are compatible. For a callback with a generic pasthrough LPARAM
parameter, you can use a ctypes.py_object
type and pass any Python object:
import ctypes
import time
from ctypes import wintypes as w
WNDENUMPROC = ctypes.WINFUNCTYPE(w.BOOL,w.HWND,ctypes.py_object)
user32 = ctypes.WinDLL('user32')
user32.GetForegroundWindow.argtypes = ()
user32.GetForegroundWindow.restype = w.HWND
user32.EnumChildWindows.argtypes = w.HWND,WNDENUMPROC,ctypes.py_object
user32.EnumChildWindows.restype = w.BOOL
@WNDENUMPROC
def callback(hwnd, obj):
print(f'callback: {hwnd} {obj}')
obj.append(hwnd)
return True
obj = []
time.sleep(2)
parent_hwnd = user32.GetForegroundWindow()
print(obj)
user32.EnumChildWindows(parent_hwnd,callback,obj)
print(obj)
[]
callback: 1051954 []
callback: 528896 [1051954]
callback: 921048 [1051954, 528896]
callback: 984872 [1051954, 528896, 921048]
callback: 1575202 [1051954, 528896, 921048, 984872]
callback: 2949434 [1051954, 528896, 921048, 984872, 1575202]
callback: 1182662 [1051954, 528896, 921048, 984872, 1575202, 2949434]
callback: 1444604 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662]
callback: 1772044 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604]
callback: 396900 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044]
callback: 2230612 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900]
callback: 854282 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612]
callback: 592926 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282]
callback: 790020 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926]
callback: 1444764 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020]
callback: 1182928 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764]
callback: 1183292 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764, 1182928]
callback: 592960 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764, 1182928, 1183292]
callback: 723948 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764, 1182928, 1183292, 592960]
callback: 461712 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764, 1182928, 1183292, 592960, 723948]
callback: 1313044 [1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764, 1182928, 1183292, 592960, 723948, 461712]
[1051954, 528896, 921048, 984872, 1575202, 2949434, 1182662, 1444604, 1772044, 396900, 2230612, 854282, 592926, 790020, 1444764, 1182928, 1183292, 592960, 723948, 461712, 1313044]