我试图在python中包装C ++函数ToUnicodeEx(),但它不能正常工作,总是返回0。
在MSDN 0上意味着:
指定的虚拟键没有针对键盘当前状态的转换。没有任何内容写入pwszBuff指定的缓冲区。
from ctypes import *
_ToUnicodeEx = WinDLL('user32').ToUnicodeEx
_ToUnicodeEx.argtypes = [c_uint,c_uint,c_byte,c_wchar_p,c_int,c_uint,c_int]
_ToUnicodeEx.restype = c_int
def ToUn(vk,sc,kst,wfl,hkid):
#b - is as in C++ pwszBuff
b = create_unicode_buffer(5)
print(_ToUnicodeEx(vk,sc,kst,b,5,wfl,hkid))
return b.value
#It must print "a" but prints "".
print(ToUn(65,0,0,0,1033))
我做错了什么,它总是返回0?
附:在C#中工作,使用相同的参数......
答案 0 :(得分:3)
这更符合ToUnicodeEx的MSDN文档:
_ToUnicodeEx.argtypes = [c_uint,c_uint,POINTER(c_char),POINTER(c_wchar),c_int,c_uint,c_void_p]
c_wchar_p
假定空终止,c_void_p
适用于句柄。第三个参数应该是一个256字节的数组,最后一个参数是可选的,所以我尝试了这个并获得了你想要的结果。我承认我不了解功能的复杂性,所以我不知道什么是适合参数的。我刚刚满足了类型要求。
from ctypes import *
_ToUnicodeEx = WinDLL('user32').ToUnicodeEx
_ToUnicodeEx.argtypes = [c_uint,c_uint,POINTER(c_char),POINTER(c_wchar),c_int,c_uint,c_void_p]
_ToUnicodeEx.restype = c_int
def ToUn(vk,sc,wfl,hkid):
kst = create_string_buffer(256)
b = create_unicode_buffer(5)
print(_ToUnicodeEx(vk,sc,kst,b,5,wfl,hkid))
return b.value
print(ToUn(65,0,0,None))
输出:
1
a