ToUnicodeEx()总是在python中返回0

时间:2016-07-06 12:41:18

标签: python winapi ctypes user32

我试图在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#中工作,使用相同的参数......

1 个答案:

答案 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