最終更新日 2024-09-25
「hmPy・IronPython」から「ネイティブdll」のWin32 APIを利用する
「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)
#・・・・