0

私はpywin32TTM_GETTEXTを使用して使用しようとしています。SendMessage問題は、lparamテキストを格納する場所である の構造が である必要があることですTOOLINFO。これは、MSDN で十分に文書化されていますが、pywin32 には対応するものはありません。Python と pywin32 を使用して同じ構造を作成する方法はありますか?

編集:を使用して思いついたコードは次のとおりですctypesStructureforをTOOLINFO作成し、そこからバッファを作成して pywin32 の に渡しSendMessage、それを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ので、何か間違ったことをしているに違いありません。

4

1 に答える 1

1

特にきれいではありませんが、structモジュールを使用して、適切なエンディアン、配置、およびパディングを使用してフィールドを文字列にパックできます。対応する基本データ型のみを正しい順序で使用して、フォーマット文字列で構造を定義する必要があるため、少し注意が必要です。

ctypes を使用して構造体の型を定義したり、(pywin32 を使用するのではなく) DLL と直接やり取りしたりすることもできます。ctypes 構造体の定義は C の定義に近いので、気に入るかもしれません。

pywin32 と共に構造体定義に ctypes を使用する場合は、構造体を文字列にシリアライズする方法の手がかりとして、以下を確認してください: ctypes (Structure <-> str) を使用してパックおよびアンパックする方法

于 2010-07-30T01:48:05.113 に答える