なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

.NET 公式で定義されている P/Invoke シグネチャーを使って Win32 API を使いたい

暇だったので .NET Foundation (github.com/dotnet) のリポジトリ一覧を眺めていると、
Windows の P/Invoke の定義をしているリポジトリがあったので、
それを使って Win32 API を呼び出してみます。


前提環境は以下の通り

  • Windows 10
  • Microsoft Visual Studio 2019
  • .NET Core 3.1

今回は、簡単に Window を列挙する API 群を使ってみます。
まずは、 PInvoke.User32 を NuGet からインストールします。

インストールしたら、あとは以下のように書くだけで、各 API が使用できます。

using System;

using static PInvoke.User32;

namespace PInvokeExample
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            EnumWindows((hWnd, param) =>
            {
                var length = GetWindowTextLength(hWnd);
                if (length > 0)
                {
                    var str = new char[length + 1];
                    GetWindowText(hWnd, str, str.Length);

                    Console.WriteLine(str);
                }

                return true;
            }, IntPtr.Zero);

            Console.ReadLine();
        }
    }
}

若干使いにくい部分 (StringBuilder 渡せなかったり) もあるけど、
各 API の定義を pinvoke.net とかから自分で用意しなくて良いので便利。
多くの Win32 API を使う場合は、こういうのを使うのもアリではないでしょうか。
ということで、ではでは(。☌ᴗ☌。)