WinAPI函数中有一些参数字段如下:
BOOL WINAPI EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam
);
"LPARAM lParam"
用于将值传递给 EnumFunc 回调。
现在我想使用 python ctypes
模块来调用它并将“python lambda
函数”传递给该回调。
我怎样才能做到这一点?
我不相信你能做到这一点。 Python 解释器可能不是被设计为从它自己没有创建的线程中调用的。要创建线程,请使用 Python 自己内置的线程支持(例如
thread.start_new_thread
或 threading.Thread
)。没有理由在这里直接使用 ctypes 和 Windows API。
假设你想要做的是从python调用
EnumWindows
,并传递一个lambda
作为LPARAM
参数,以便回调函数可以将LAPRAM
转换为函数并调用它,那么以下代码执行此操作:
from ctypes import *
from ctypes.wintypes import *
ENUMWINDOWSPROC = WINFUNCTYPE(BOOL, HWND, LPARAM)
LAMBDAPROC = WINFUNCTYPE(None, HWND)
def enumWindowsProc( hWnd, lParam ):
func = LAMBDAPROC(lParam)
func( hWnd )
return True
lambdaProc = LAMBDAPROC(lambda x: print("hWnd:", x))
windll.user32.EnumWindows.argtypes = (ENUMWINDOWSPROC, LPARAM)
windll.user32.EnumWindows(ENUMWINDOWSPROC(enumWindowsProc), cast(lambdaProc, LPVOID).value)
(在 win32 上使用 Python 3.11.4 [MSC v.1934 64 位 (AMD64)] 进行测试)