File: Windows\Win32\Foundation\Interop.PARAM.cs
Web Access
Project: src\src\System.Windows.Forms.Primitives\src\System.Windows.Forms.Primitives.csproj (System.Windows.Forms.Primitives)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
 
namespace Windows.Win32.Foundation;
 
/// <summary>
///  Helpers for creating W/LPARAM arguments for messages.
/// </summary>
internal static class PARAM
{
    public static nint FromLowHigh(int low, int high) => ToInt(low, high);
 
    public static nint FromLowHighUnsigned(int low, int high)
        // Convert the int to an uint before converting it to a pointer type,
        // which ensures the high DWORD being zero for 64-bit pointers.
        // This corresponds to the logic of the MAKELPARAM/MAKEWPARAM/MAKELRESULT
        // macros.
        => (nint)(uint)ToInt(low, high);
 
    public static int ToInt(int low, int high)
        => (high << 16) | (low & 0xffff);
 
    public static int HIWORD(int n)
        => (n >> 16) & 0xffff;
 
    public static int LOWORD(int n)
        => n & 0xffff;
 
    public static int LOWORD(nint n)
        => LOWORD((int)n);
 
    public static int HIWORD(nint n)
        => HIWORD((int)n);
 
    public static int SignedHIWORD(nint n)
        => SignedHIWORD((int)n);
 
    public static int SignedLOWORD(nint n)
        => SignedLOWORD(unchecked((int)n));
 
    public static int SignedHIWORD(int n)
        => (short)HIWORD(n);
 
    public static int SignedLOWORD(int n)
        => (short)LOWORD(n);
 
    public static nint FromBool(bool value)
        => (nint)(BOOL)(value);
 
    /// <summary>
    ///  Hard casts to <see langword="int" /> without bounds checks.
    /// </summary>
    public static int ToInt(nint param) => (int)param;
 
    /// <summary>
    ///  Hard casts to <see langword="uint" /> without bounds checks.
    /// </summary>
    public static uint ToUInt(nint param) => (uint)param;
 
    /// <summary>
    ///  Packs a <see cref="Point"/> into a PARAM.
    /// </summary>
    public static nint FromPoint(Point point)
        => FromLowHigh(point.X, point.Y);
 
    /// <summary>
    ///  Unpacks a <see cref="Point"/> from a PARAM.
    /// </summary>
    public static Point ToPoint(nint param)
        => new(SignedLOWORD(param), SignedHIWORD(param));
}