Python ctypes调用GetClassInfoW返回乱码类名的原因排查
ctypes调用GetClassInfoW返回乱码的原因及解决方法
这不是ctypes的bug,是混用ANSI和Unicode版本Windows API导致的操作错误。
问题原因
你通过RegisterClassA注册了ANSI编码的窗口类,但调用GetClassInfoW(Unicode版本API)查询该类。Windows系统中ANSI和Unicode版本的窗口类是相互独立的:
RegisterClassA注册的类仅能被GetClassInfoA正确查询RegisterClassW注册的类仅能被GetClassInfoW正确查询
当GetClassInfoW找不到对应Unicode版本的类时,返回的指针指向无效内存区域,最终输出乱码。
解决方法
有两种可行的修正方案:
方案1:注册并查询Unicode版本窗口类
修改代码使用Unicode版本API完成注册和查询:
- 补充
RegisterClassW的类型定义:
user32.RegisterClassW.argtypes = POINTER(WNDCLASSW), user32.RegisterClassW.restype = w.ATOM user32.RegisterClassW.errcheck = errcheck
- 替换注册逻辑为Unicode版本:
wndclass = WNDCLASSW() wndclass.lpfnWndProc = WNDPROC(user32.DefWindowProcW) wndclass.hInstance = hInstance wndclass.lpszMenuName = 'Foo' wndclass.lpszClassName = 'BarClass' user32.RegisterClassW(byref(wndclass))
此时调用GetClassInfoW就能正确返回BarClass。
方案2:保持ANSI注册,仅用ANSI API查询
如果不需要Unicode窗口类,保持原注册代码不变,只使用GetClassInfoA查询即可,避免混用不同编码版本的API。
内容的提问来源于stack exchange,提问作者Kuba hasn't forgotten Monica
相关产品推荐
相关产品推荐

