ctypes で WindowsAPI

Python には Windows の DLL に直接アクセスできるモジュールがあるようで。

14.14 ctypes — Pythonのための外部関数ライブラリ。

面白そうなので試してみる。
実験だから簡単なのにしたいなぁ。
MessaageBox 関数ならロードする関数は一つなのでコレでいこう。

14.14.1.2 ロードしたdllから関数にアクセスする

に書いてあるけど Windows の関数は Ansi 版と UNICODE 版がある。
当然 TCHAR マクロも使えない、これは VC++ がコンパイル時に変換しているから。

MessageBox 関数も例外ではない。
MessageBoxA と MessageBoxW にコンパイル時に振り分けされる。
幸いにも Python3.0 の文字列は UNICODE なので MessageBoxW を使う。

そして MessageBoxW は user32.dll にあります。
ということで。

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import ctypes

MB_OK = 0
MB_OKCANCEL = 0x00000001
IDOK = 1

dll = ctypes.windll.user32
res = dll.MessageBoxW(0, str(dll), "たいとる", MB_OKCANCEL)

if res == IDOK:
    dll.MessageBoxW(0, "OK を押しました", "りざると", MB_OK)
else:
    dll.MessageBoxW(0, "きゃんせるを押しました", "りざると", MB_OK)

mbox

うわぁコレでいけちゃうんだ。
MB_OK とかの定義は WindowsSDK の WinUser.h を見てちょ。

全部 DLL から呼び出せばウインドウもコントロールも作れるね。
でも定数を全部自分で定義せにゃいかんのが面倒そう…