如何传递Python lambda来赢得从ctypes导出的API函数“LPVOID”参数字段?

问题描述 投票:0回答:2

WinAPI函数中有一些参数字段如下:

BOOL WINAPI EnumWindows(
  _In_  WNDENUMPROC lpEnumFunc,
  _In_  LPARAM lParam
);

"LPARAM lParam"
用于将值传递给 EnumFunc 回调。 现在我想使用 python
ctypes
模块来调用它并将“python
lambda
函数”传递给该回调。

我怎样才能做到这一点?

python windows winapi ctypes
2个回答
0
投票

我不相信你能做到这一点。 Python 解释器可能不是被设计为从它自己没有创建的线程中调用的。要创建线程,请使用 Python 自己内置的线程支持(例如

thread.start_new_thread
threading.Thread
)。没有理由在这里直接使用 ctypes 和 Windows API。


0
投票

假设你想要做的是从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)] 进行测试)

© www.soinside.com 2019 - 2024. All rights reserved.