pythonでWindows APIを実行する

pythonでWindows API(DLL)を実行するには「ctypes」というライブラリを使用すればよいみたい.
チュートリアルに書いてあることでほぼ事足りる感じ.
Windowsだと結構Cだとヘッダーファイルの#defineで「GetModuleHandle」が「GetModuleHandleA」「GetModuleHandleW」に自動的に書き換えられるけど,pythonみたいにDLLから直接実行する場合はAやWを付けて実行しないといけない.
(ホントはunicodeとかに応じて場合分けして実行すべきなんだろうけどめんどくさい)

ctypesでは,ほとんどCと同じことができる.ポインタ,構造体,配列からコールバックまで!
ctypes.sizeofで構造体のC言語での大きさとかも調べらる.
LASTINPUTINFOのcbSizeみたいに,Windows APIで使われる構造体では自分の構造体の大きさを指定しなきゃいけないことが多いので便利.

後はGetWindowTextのlpStringみたいに呼び出す側で文字列領域確保しといてね,ってケースもWindow APIには多い.
そうした場合にはこんな感じにすればいいみたい.

import ctypes
user = ctypes.windll.user32
def getWindowText(hwnd):
    # 文字の長さ取得
    length = user.GetWindowTextLengthW(hwnd) + 1
    # 文字列領域確保
    s = (ctypes.c_wchar * length)()
    # 文字列領域に参照でテキスト取得
    user.GetWindowTextW(hwnd, ctypes.byref(s), length)
    return s.value

コードの見栄えを良くするのはどうしたらいいんだろう.
まぁおいおいね.