Python Memorybuffer pywin32 - PullRequest
       15

Python Memorybuffer pywin32

0 голосов
/ 07 ноября 2018

У меня есть код:

    def get_text(self, id):
        edit_hwnd = win32gui.GetDlgItem(self.hwnd, id)  # 获取窗口句柄
        time.sleep(0.2)
        self.edit_hwnd = edit_hwnd
        length = win32api.SendMessage(
             edit_hwnd, win32con.WM_GETTEXTLENGTH) + 1  # 获取窗体内容长度
        buf = win32gui.PyMakeBuffer(length)  # 准备buffer对象作为容器
        win32gui.SendMessage(edit_hwnd, win32con.WM_GETTEXT,
                         length, buf)  # 获取窗体内容放入容器
        try:
            address, length = win32gui.PyGetBufferAddressAndLen(buf)  # 获取容器的内存地址
        except ValueError:
            print('error')
            return
        text = win32gui.PyGetString(address, length)  # 取得字符串
        buf.release()
        del buf
        return text

Эта функция для получения строки в Windows. Мне нужно, чтобы эта функция всегда получала это значение. Когда значение изменяется, я что-то делаю. Но теперь, когда я это сделал, моя программа завершает работу с кодом ошибки C000005.Как можно я исправляю это.

buf.release()
del buf

Это я добавил, когда обнаружил эту проблему. Похоже, не работает.

1 Ответ

0 голосов
/ 07 ноября 2018

Сообщения WM_GETTEXTLENGTH возвращают длину текста в символах ( исключая завершающий нулевой символ) и максимальную длину буфера, заданную для WM_GETTEXT также основано на символах (, включая завершающий нулевой символ).

Символ в системах Windows на базе NT кодируется двухбайтовым набором символов (DBCS), что означает два байта на символ.

Функция win32gui.PyMakeBuffer(length) возвращает буфер размером length байт .

Таким образом, если length является возвращаемым значением WM_GETTEXTLENGTH, зарезервированный буфер должен иметь длину length * 2 + 2 байт, а максимальная длина буфера, заданная для WM_GETTEXT, должна составлять length + 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...