最終更新日 2024-09-25

「hmPy・IronPython」から「ネイティブdll」のWin32 APIを利用する

概要

こちらは王道となる「C#でラップする例」となります。

これは「C#」で作ったdllの読み込みと同じこととなります。

「C#」でのラップ例

C#を使ってラップする例としては、以下のように、dll名自体をclassとするのが良いでしょう。

#using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace UnmanagedCode
{
    public class GDI32
    {
        [DllImport("GDI32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport("GDI32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth,
            int nHeight);

        [DllImport("GDI32.dll")]
        public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

        [DllImport("GDI32.dll")]
        public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest,
                                         int nWidth, int nHeight, IntPtr hdcSrc,
                                         int nXSrc, int nYSrc, int dwRop);

        [DllImport("GDI32.dll")]
        public static extern bool DeleteDC(IntPtr hdc);

        [DllImport("GDI32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
    }

    public class User32
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll")]
        public static extern IntPtr GetTopWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        public static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);

        [DllImport("User32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr hWnd);

        [DllImport("User32.dll")]
        public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);

    }
}

C#で作ったdllを利用するIronPythonは以下のようなパターンとなることでしょう。
「currentmacrodirectory」がなぜ必要かなどは、「C#」で作ったdllの読み込みを参照してください。

import clr

import sys
# currentmacrodirectoryは秀丸マクロ側から伝達されているものとする
sys.path.append(currentmacrodirectory)
# dllの名前を拡張子など抜きで
clr.AddReferenceByPartialName("UnmanagedCode")
clr.AddReference('System.Drawing')

from System.Drawing import Bitmap, Image
from UnmanagedCode import User32, GDI32

def ScreenCapture(x, y, width, height):
     hdcSrc = User32.GetWindowDC(User32.GetDesktopWindow())
     hdcDest = GDI32.CreateCompatibleDC(hdcSrc)
     hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height)
     GDI32.SelectObject(hdcDest, hBitmap)

     #・・・・