Pywin32调用SelectObject传入HBITMAP报非PyHANDLE错误如何解决
Pywin32调用SelectObject类型错误解决方案
报错根因
报错TypeError: The object is not a PyHANDLE object的核心原因是ctypes返回的原生Win32句柄和Pywin32封装的PyHANDLE类型不兼容:
你当前代码混用了ctypes调用的Win32接口和Pywin32提供的接口,ctypes调用CreateBitmap返回的是int类型的原生HBITMAP句柄,而Pywin32的SelectObject只接受其内部封装的PyHANDLE类型对象,直接传原生int句柄就会触发类型校验失败。
解决方案
方案1:统一使用Pywin32的API完成操作(推荐)
所有内存分配、位图创建、DC操作都走Pywin32封装的接口,避免类型不兼容问题:
import win32api import win32gui import win32con # 变量x、y、hdcdc需提前正确定义 data = win32api.VirtualAlloc(0, (x*y+x)*512, win32con.MEM_COMMIT | win32con.MEM_RESERVE, win32con.PAGE_READWRITE) hbm = win32gui.CreateBitmap(x, y, 1, 32, data) # 此时hbm为PyHANDLE类型,可直接传入SelectObject win32gui.SelectObject(hdcdc, hbm)
方案2:手动包装原生句柄为PyHANDLE类型
如果必须保留ctypes的调用逻辑,直接用Pywin32提供的PyHANDLE类包装ctypes返回的int类型句柄即可:
import win32ui # 假设hbm是ctypes调用CreateBitmap返回的int类型原生句柄 wrapped_hbm = win32ui.PyHANDLE(hbm) SelectObject(hdcdc, wrapped_hbm)
注意事项
操作完成后需按Win32规范释放资源:先将位图从DC中移出,再调用DeleteObject释放位图句柄,最后调用VirtualFree释放申请的内存,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Geometry sten
相关产品推荐
相关产品推荐

