俺言語。

自分にしか理解できない言語で書かれた備忘録

【Python】GetWindowTextで取得できない文字列を取得する方法(win32api SendMessage WM_GETTEXT)

GetWindowTextで文字列が取得できない場合(他プロセスのコントロール文字列は取得できないらしい、意味不明)は

指定のハンドルにメッセージを投げて文字列を取得する。

投げるメッセージの定数はwinuser32.h内に記載されている。

ハンドルはspy++等で調べることが可能,16進数の整数。

SendMessageは末尾に"A"(ANSI版)と"W"(unicode版)どちらかが選択できるが

日本語で帰ってくる可能性があるはずなので"W"にしてみている。今のところ問題はなし。

import ctypes

def get_control_text():
     # ハンドル
     hwnd = 0x0001096C

     # 定数はwinuser.hに定義されている
     msg_gettextlength = 0x000E
     msg_gettext = 0x000D

     # 受け取るテキストの文字長さを取得(wParam,lParamは0にすること) 終端文字列は含まず
     len_str = ctypes.windll.user32.SendMessageW(hwnd, msg_gettextlength, 0, 0 )

     # 文字列バッファを定義
     buff = ctypes.create_unicode_buffer(len_str + 1)

     # 文字列を取得 第3引数にwParamに文字数,第4引数にlParamに文字列バッファ
     ctypes.windll.user32.SendMessageW(hwnd, msg_gettext, len_str +1, buff )