LoginSignup
1
1

More than 1 year has passed since last update.

Python Win32 APIでウインドウメッセージ

Last updated at Posted at 2021-06-09

前回 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をつくるといったこともできそうです。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1