single.php

C# WinUI3でプラットフォームに応じてWin32 APIを切り替える方法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3 プロジェクトでビルドするプラットフォーム(x86/x64)でWin32で呼び出す関数の切り替えを行う方法です。

アプリケーションのリソースから取得

Win32関数の[GetWindowLong]を呼び出したい場合、ビルドを行うプラットフォームが64ビット環境(x64)で呼び出すとエラーになります。

x64環境向けに[GetWindowLongPtr]関数が用意されていて、それぞれ使い分ける必要があります。

ビルドするプラットフォームを変更する度に、どちらかをコメントアウトする方法もありますが、[IntPtr]型のサイズで切り替えが可能。

こんな感じで、[GetWindowLong]と[SetWindowLong]の定義をします。

[DllImport("user32.dll", EntryPoint = "GetWindowLong", SetLastError = true)]
private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", SetLastError = true)]
private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
private static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", SetLastError = true)]
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

それぞれを呼び出す際に[IntPtr]型のサイズで条件分岐させると、ビルド時のプラットフォームによって呼び出す関数を使い分けができます。

private IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
{
    if (IntPtr.Size == 8)
        return GetWindowLongPtr64(hWnd, nIndex);
    else
        return GetWindowLongPtr32(hWnd, nIndex);
}

private IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
    if (IntPtr.Size == 8)
        return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
    else
        return SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
}

まとめ

今回は、短い記事ですが、WinUI3プロジェクトでビルド時のプラットフォームによって呼び出す関数を切り替える方法を紹介しました。

サンプルとして、[GetWindowLong]と[SetWindowLong]関数について書きましたが、条件判断する方法は同じなので、Win32 API 以外でも使い道はありそうです。

WinUI 3でビルド時のプラットフォームに応じて条件分岐したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です