преобразование структур в c для Pywin32? - PullRequest
0 голосов
/ 30 июля 2010

Я пытаюсь использовать TTM_GETTEXT через SendMessage, используя pywin32.проблема в том, что структура lparam, в которой должен храниться текст, должна быть TOOLINFO, что хорошо документировано в MSDN, но не имеет аналога в pywin32.Есть ли способ создать ту же структуру, используя python и pywin32?

Edit: вот код, который я придумал, используя ctypes.Я сделал Structure для TOOLINFO, создал из него буфер для передачи в SendMessage pywin32, а затем преобразовал его обратно в TOOLINFO ctypes Structure.Единственная проблема в том, что он не работает:

# My TOOLINFO struct:
class TOOLINFO(Structure):
  _fields_ = [("cbSize", UINT),
              ("uFlags", UINT),
              ("hwnd", HWND),
              ("uId", POINTER(UINT)),
              ("rect", RECT),
              ("hinst", HINSTANCE),
              ("lpszText", LPWSTR),
              ("lpReserved", c_void_p)]

# send() definition from PythonInfo wiki FAQs
def send(self):
  return buffer(self)[:]

ti = TOOLINFO()
text = ""
ti.cbSize = sizeof(ti)
ti.lpszText = text                 # buffer to store text in
ti.uId = pointer(UINT(wnd))        # wnd is the handle of the tooltip
ti.hwnd = w_wnd                    # w_wnd is the handle of the window containing the tooltip
ti.uFlags = commctrl.TTF_IDISHWND  # specify that uId is the control handle
ti_buffer = send(ti)               # convert to buffer for pywin32

del(ti)

win32gui.SendMessage(wnd, commctrl.TTM_GETTEXT, 256, ti_buffer)

ti = TOOLINFO()              # create new TOOLINFO() to copy result to

# copy result (according to linked article from Jeremy)
memmove(addressof(ti), ti_buffer, sizeof(ti))

if ti.lpszText:
  print ti.lpszText          # print any text recovered from the tooltip

Текст не печатается, но я предположил, что он должен содержать текст из подсказки, из которой я хочу извлечь.Что-то не так с тем, как я использовал ctypes?Я совершенно уверен, что мои значения для wnd и w_wnd верны, поэтому я, должно быть, что-то делаю не так.

1 Ответ

1 голос
/ 30 июля 2010

Это не очень красиво, но вы можете использовать модуль struct , чтобы упаковать поля в строку с соответствующим порядком байтов, выравниванием и заполнением.Это немного сложно, так как вы должны определить структуру с помощью строки формата, используя только соответствующие фундаментальные типы данных в правильном порядке.

Вы также можете использовать ctypes для определения типов структуры или также напрямую взаимодействовать с DLL (вместоиспользуя pywin32).Определения структуры ctypes ближе к определениям C, поэтому вам, возможно, понравится больше.

Если вы решите использовать ctypes для определения структуры вместе с pywin32, ознакомьтесь со следующей информацией, чтобы понять, как сериализовать структуры в строки: Как упаковать и распаковать, используя ctypes (Structure <-> str)

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