You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:39:02