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でビルド時のプラットフォームに応じて条件分岐したい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。