Python 入門

ホーム > ctypes パッケージ > Python から Windows API を呼び出す - MessageBox の例

Python から Windows API を呼び出す - MessageBox の例

Windows 環境で Python を実行している時に、 任意の Windows API を呼び出す方法を説明します。まずはもっとも簡単な例から説明します。

なぜ簡単かと言うと、パラメータとなるデータ構造がシンプルな型だからです。 後ほど、構造体などを引数として受けとる場合を扱いますが、ここではまずは単純な例として MessageBox API を呼び出すことでポップアップを表示させます。

Python から Windows API - MessageBox を呼ぶ方法

具体的には、ここでは Python のスクリプトから次のように Windows のメッセージボックスを表示します。

Python から Windows API を呼ぶ

これを実現するコードは次の通りです。

from ctypes import *

user32 = windll.user32

user32.MessageBoxA(
    0, 
    "Hello, MessageBox!", 
    "Python to Windows API", 
    0x00000040)

もちろん Windows 上で実行しないと失敗します。 試しに Linux で走らせると次のようなエラーになりました。

Traceback (most recent call last):
  File "/.../CtypesTest1.py", line 3, in 
    user32 = windll.user32
NameError: name 'windll' is not defined

さて、それでは上記のコードの意味を説明します。

まずは ctypes パッケージを読み込みます。

from ctypes import *

次に windll を使って DLL をロードします。

user32 = windll.user32

C のライブラリでは通常呼出し規則は cdecl ですが、 Windows API では stdcall です。このため、 Windows 上ではライブラリをロードするために、 cdll の他、 windlloledll が用意されています。oledll は呼出し規則は stdcall ですが戻り値が HRESULT を想定されます。

尚、Windows の呼出し規則等がよく分からないという人は Windows プログラミング入門 - 関数を呼び出すということ などを参照してください。

また cdll の利用については、Python から C のライブラリ関数を呼び出す も参考にしてください。

さて、 MessageBox 関数は user32.dll にエクスポートされているので、 user32.dll を読み込んでいます。 Windows API については、 ある関数がどの DLL にあるかは dumpbin などするまでもなく MSDN ライブラリなどをみればだいたいわかります。

user32.MessageBoxA(
    0, 
    "Hello, MessageBox!", 
    "Python to Windows API", 
    0x00000040)

MessageBox の呼出し箇所はここです。MessageBox ではなく、 MessageBoxA として呼び出していることに注意してください。

Windows の API では大抵 ANSI版とユニコード(ワイドキャラクタ)版があるので、 MessageBox とひとことで言ったときには、 実際には裏で MessageBoxA と MessageBoxW が用意されています。

第一引数は親ウィンドウのウィンドウハンドルで NULL で OK。第二、第三引数はメッセージとキャプション。4つめの引数は、アイコンを表示するために MB_ICONINFORMATION (=0x00000040) をわたしています。

これを呼び出せば上記のようにメッセージボックスが表示されるはずです。

ホーム > ctypes パッケージ > Python から Windows API を呼び出す - MessageBox の例