Vanara/PInvoke/ComCtl32/CommCtrl.IPAddress.cs

120 lines
7.6 KiB
C#

using System;
using System.Runtime.InteropServices;
using static Vanara.PInvoke.User32_Gdi;
// ReSharper disable InconsistentNaming
// ReSharper disable FieldCanBeMadeReadOnly.Global ReSharper disable InconsistentNaming
namespace Vanara.PInvoke
{
public static partial class ComCtl32
{
/// <summary>Creates IP address controls. These controls are similar to an edit control, but they enable you to enter a numeric address in Internet protocol (IP) format.</summary>
public const string WC_IPADDRESS = "SysIPAddress32";
private const int IPN_FIRST = -860;
#pragma warning disable 1584, 1711, 1572, 1581, 1580
/// <summary>IP Address Messages</summary>
public enum IPAddressMessage
{
/// <summary>Clears the contents of the IP address control.</summary>
/// <param name="wParam">Must be zero.</param>
/// <param name="lParam">Must be zero.</param>
/// <returns>The return value is not used.</returns>
IPM_CLEARADDRESS = WindowMessage.WM_USER + 100,
/// <summary>Sets the address values for all four fields in the IP address control.</summary>
/// <param name="wParam">Must be zero.</param>
/// <param name="lParam">A DWORD value that contains the new address. The field 3 value is contained in bits 0 through 7. The field 2 value is contained in bits 8 through 15. The field 1 value is contained in bits 16 through 23. The field 0 value is contained in bits 24 through 31. The MAKEIPADDRESS macro can also be used to create the address information.</param>
/// <returns>The return value is not used.</returns>
IPM_SETADDRESS = WindowMessage.WM_USER + 101,
/// <summary>Gets the address values for all four fields in the IP address control.</summary>
/// <param name="wParam">Must be zero.</param>
/// <param name="lParam">A pointer to a DWORD value that receives the address. The field 3 value will be contained in bits 0 through 7. The field 2 value will be contained in bits 8 through 15. The field 1 value will be contained in bits 16 through 23. The field 0 value will be contained in bits 24 through 31. The FIRST_IPADDRESS, SECOND_IPADDRESS, THIRD_IPADDRESS, and FOURTH_IPADDRESS macros can also be used to extract the address information. Zero will be returned as the address for any blank fields.</param>
/// <returns>Returns the number of nonblank fields.</returns>
IPM_GETADDRESS = WindowMessage.WM_USER + 102,
/// <summary>ets the valid range for the specified field in the IP address control.</summary>
/// <remarks>If the user enters a value in the field that is outside of this range, the control will send the IPN_FIELDCHANGED notification with the entered value. If the value is still outside of the range after sending the notification, the control will attempt to change the entered value to the closest range limit.</remarks>
/// <param name="wParam">A zero-based field index to which the range will be applied.</param>
/// <param name="lParam">A WORD value that contains the lower limit of the range in the low-order byte and the upper limit in the high-order byte. Both of these values are inclusive. The MAKEIPRANGE macro can also be used to create the range.</param>
/// <returns>Returns nonzero if successful, or zero otherwise.</returns>
IPM_SETRANGE = WindowMessage.WM_USER + 103,
/// <summary>Sets the keyboard focus to the specified field in the IP address control. All of the text in that field will be selected.</summary>
/// <param name="wParam">A zero-based field index to which the focus should be set. If this value is greater than the number of fields, focus is set to the first blank field. If all fields are nonblank, focus is set to the first field.</param>
/// <param name="lParam">Must be zero.</param>
/// <returns>The return value is not used.</returns>
IPM_SETFOCUS = WindowMessage.WM_USER + 104,
/// <summary>Determines if all fields in the IP address control are blank.</summary>
/// <param name="wParam">Must be zero.</param>
/// <param name="lParam">Must be zero.</param>
/// <returns>Returns nonzero if all fields are blank, or zero otherwise.</returns>
IPM_ISBLANK = WindowMessage.WM_USER + 105,
}
/// <summary>IP Address Notifications</summary>
public enum IPAddressNotification
{
/// <summary>Sent when the user changes a field in the control or moves from one field to another. This notification code is sent in the form of a WM_NOTIFY message.</summary>
/// <param name="lParam">A pointer to an NMIPADDRESS structure that contains information about the changed address. The iValue member of this structure will contain the entered value, even if it is out of the range of the field. You can modify this member to any value that is within the range for the field in response to this notification code.</param>
/// <returns>The return value is ignored.</returns>
IPN_FIELDCHANGED = IPN_FIRST - 0
}
#pragma warning restore 1584, 1711, 1572, 1581, 1580
/// <summary>Gets the IP address represented as a byte array from an unsigned pointer.</summary>
/// <param name="ipAddress">The IP address.</param>
/// <returns>The IP address represented as a byte array.</returns>
public static byte[] GET_IPADDRESS(UIntPtr ipAddress)
{
var i = ipAddress.ToUInt32();
return new[] { (byte)((i >> 24) & 0xff), (byte)((i >> 16) & 0xff), (byte)((i >> 8) & 0xff), (byte)(i & 0xff) };
}
/// <summary>Packs four byte-values into a single LPARAM suitable for use with the IPM_SETADDRESS message.</summary>
/// <param name="b0">The field 0 address.</param>
/// <param name="b1">The field 1 address.</param>
/// <param name="b2">The field 2 address.</param>
/// <param name="b3">The field 3 address.</param>
/// <returns>Returns an LPARAM value that contains the address.</returns>
[PInvokeData("Commctrl.h", MSDNShortId = "bb761385")]
public static UIntPtr MAKEIPADDRESS(byte b0, byte b1, byte b2, byte b3) => new UIntPtr(((uint)b0 << 24) | ((uint)b1 << 16) | ((uint)b2 << 8) | b3);
/// <summary>Packs four byte-values into a single LPARAM suitable for use with the IPM_SETADDRESS message.</summary>
/// <param name="bytes">The bytes ordered 0-3.</param>
/// <returns>Returns an LPARAM value that contains the address.</returns>
[PInvokeData("Commctrl.h", MSDNShortId = "bb761385")]
public static UIntPtr MAKEIPADDRESS(byte[] bytes)
{
if (bytes != null && bytes.Length != 4)
throw new ArgumentOutOfRangeException(nameof(bytes), "Array must contain exactly four items.");
return bytes == null ? UIntPtr.Zero : MAKEIPADDRESS(bytes[0], bytes[1], bytes[2], bytes[3]);
}
/// <summary>Packs two byte-values into a single LPARAM suitable for use with the IPM_SETRANGE message.</summary>
/// <param name="low">The lower limit of the range.</param>
/// <param name="high">The upper limit of the range.</param>
/// <returns>Returns an LPARAM value that contains the range.</returns>
[PInvokeData("Commctrl.h", MSDNShortId = "bb761386")]
public static UIntPtr MAKEIPRANGE(byte low, byte high) => (UIntPtr)((high << 8) + low);
/// <summary>Contains information for the IPN_FIELDCHANGED notification code.</summary>
[PInvokeData("Commctrl.h", MSDNShortId = "bb761375")]
[StructLayout(LayoutKind.Sequential)]
public struct NMIPADDRESS
{
/// <summary>An NMHDR structure that contains additional information about the notification.</summary>
public NMHDR hdr;
/// <summary>The zero-based number of the field that was changed.</summary>
public int iField;
/// <summary>The new value of the field specified in the iField member. While processing the IPN_FIELDCHANGED notification, this member can be set to any value that is within the range of the field and the control will place this new value in the field.</summary>
public int iValue;
}
}
}