前回 Python Win32 APIでウインドウを前面に出す
ウインドウメッセージ
ウインドウメッセージを利用してウインドウの操作ができます。例えば、メモ帳を開いているとき、そのテキストをPythonで取得することができます。
from ctypes import *
FindWindowEx = windll.user32.FindWindowExW
SendMessage = windll.user32.SendMessageW
EnumWindows = windll.user32.EnumWindows
EnumChildWindows = windll.user32.EnumChildWindows
# WM_SETTEXT = 0x000c
WM_GETTEXT = 0x000d
WM_GETTEXTLENGTH = 0x000e
WNDENUMPROC = WINFUNCTYPE(c_bool, POINTER(c_int), POINTER(c_int))
def EnumChildProc(hwnd, lParam):
length = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)
buff = create_unicode_buffer(length + 1)
ret = SendMessage(hwnd, WM_GETTEXT, length + 1, buff)
print(buff.value)
return True
def EnumWindowsProc(hwnd, lParam):
global ghwnd
length = GetWindowTextLength(hwnd)
buff = create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
if "メモ帳" in buff.value:
EnumChildWindows(hwnd, WNDENUMPROC(EnumChildProc), 0)
return False
return True
EnumWindows(WNDENUMPROC(EnumWindowsProc), 0)
WM_GETTEXT,WM_GETTEXTLENGTHがウインドウメッセージです。C言語だったらマクロが定義されていますが、Pythonでは定義値を調べてグローバル変数にするといった形になります。
WM_GETTEXT
https://docs.microsoft.com/ja-jp/windows/win32/winmsg/wm-gettext
SendMessageやPostMessageでメッセージを送信すれば、メモ帳内でそのメッセージの処理が呼び出されます。
(実際にテキストを保持しているのは子ウインドウなので、EnumChildWindowsで探しています)
これは、C言語とPythonの間でプロセス間通信ができるということです。ウインドウによって対応するメッセージが異なるので、狙い通りの操作をするのはなかなか難しいですが、C言語のソフトに対してPythonでGUIをつくるといったこともできそうです。