Задать вопрос

Почему корежится строка с кириллицей в create_string_buffer?

Доброго времени суток.
Подскажите, в чем может быть проблема, имеется вот такой код на Python:
import time
from ctypes import *
from win32con import *
from ctypes.wintypes import HWND, DWORD
from win32gui import GetForegroundWindow, SendMessage
from win32process import GetWindowThreadProcessId

GetGUIThreadInfo = windll.user32.GetGUIThreadInfo

class RECT(Structure):
    _fields_ = [("left", c_ulong),
                ("top", c_ulong),
                ("right", c_ulong),
                ("bottom", c_ulong)]

class GUITHREADINFO(Structure):
    _fields_ = [("cbSize", DWORD),
                ("flags", DWORD),
                ("hwndActive", HWND),
                ("hwndFocus", HWND),
                ("hwndCapture", HWND),
                ("hwndMenuOwner", HWND),
                ("hwndMoveSize", HWND),
                ("hwndCaret", HWND),
                ("rcCaret", RECT)]

time.sleep(5)
PID = GetWindowThreadProcessId(GetForegroundWindow())
lpgui = GUITHREADINFO()
lpgui.cbSize = sizeof(GUITHREADINFO)
GetGUIThreadInfo(PID[0], pointer(lpgui))

textMaxSize = 32
text = create_string_buffer(textMaxSize)
SendMessage(lpgui.hwndFocus, WM_GETTEXT, textMaxSize, text)
print(text.value)


при его запуске на Python 2.7 x32 и активации, например, кона блокнота с текстом 'Hellow(Привет)' в буфере корректный текст, при запуске на Python 3.6 x64 строка корежится, получаю вот такое b'H', в text.raw записывается вот такое значение bytes: b'H\x00e\x00l\x00l\x00o\x00w\x00(\x00\x1f\x04@\x048\x042\x045\x04B\x04)\x00\x00\x00\x00\x00' при этом корректно сконвертировать это набор байтов никак не получается. Помогите разобраться.
  • Вопрос задан
  • 191 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@PavlovNik Автор вопроса
Разобрался в чем проблема, в text.value по умолчанию кодируется строка в utf-8, а SendMessage записывает в буфер символ в двух байтах, т.е. если самому перекодировать буфер вот так:
print(text.raw.decode('utf-16'))
то все отображается корректно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы