2016-07-06 4 views
-1

내가 파이썬에서 C++ 함수 ToUnicodeEx()를 감싸려고하지만 항상 MSDN에 0
0 수단 반환, 제대로 작동 :
ToUnicodeEx()는 항상 파이썬에서 0 반환

지정된를 가상 키에는 현재 키보드 상태에 대한 변환이 없습니다. pwszBuff에 의해 지정된 버퍼에 아무것도 쓰여지지 않았습니다. 항상 0을 반환

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)) 

은 내가, 뭔가 잘못입니까?
P.

_ToUnicodeEx.argtypes = [c_uint,c_uint,POINTER(c_char),POINTER(c_wchar),c_int,c_uint,c_void_p] 

c_wchar_p가 null 종료를 가정하고 c_void_p이 핸들에 적합한 : C#에서이 ... 같은 인수,

+0

가 언제부터 USER32 C로 작성되었습니다 + +? –

+0

죄송합니다. 이것은 오타였습니다. – BladeMight

+0

'ToUnicodeEx()'에 대한 대부분의 매개 변수를 무시하거나 잘못된 것을 완전히 전달합니다 ('1033' 자체는'HKL'이 아니며 먼저로드되어야합니다). 무엇을 성취하려고합니까? – andlabs

답변

2

이 더 자세히 ToUnicodeEx에 대한 MSDN 설명서를 일치를했다. 세 번째 매개 변수는 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