[fix]修正UdpServer在接收广播时连续启动接收的错误,在StarAgent中,此时可能收到广播包,SocketFlags是Broadcast,需要清空,否则报错“参考的对象类型不支持尝试的操作”; 无需设置SocketOptionName.PacketInformation,在ReceiveMessageFromAsync时会自动设置,并且支持ipv6;
石头 编写于 2024-10-10 00:36:00 石头 提交于 2024-10-10 00:45:43
X
using System.Runtime.InteropServices;

namespace NewLife.Windows;

/// <summary>系统电源状态</summary>
public enum PowerLineStatus
{
    /// <summary>脱机状态</summary>
    Offline = 0,
    /// <summary>联机状态</summary>
    Online = 1,
    /// <summary>电源状态未知</summary>
    Unknown = 255
}

/// <summary>充电状态信息</summary>
[Flags]
public enum BatteryChargeStatus
{
    /// <summary>指示电池能量级别较高</summary>
    High = 1,
    /// <summary>指示电池能量级别较低</summary>
    Low = 2,
    /// <summary>指示电池能量严重不足</summary>
    Critical = 4,
    /// <summary>指示电池正在充电</summary>
    Charging = 8,
    /// <summary>指示没有电池存在</summary>
    NoSystemBattery = 0x80,
    /// <summary>指示未知电池状态</summary>
    Unknown = 0xFF
}

/// <summary>电源状态</summary>
public class PowerStatus
{
    private SYSTEM_POWER_STATUS systemPowerStatus;

    /// <summary>当前的系统电源状态</summary>
    public PowerLineStatus PowerLineStatus
    {
        get
        {
            UpdateSystemPowerStatus();
            return (PowerLineStatus)systemPowerStatus.ACLineStatus;
        }
    }

    /// <summary>当前的电池电量状态</summary>
    public BatteryChargeStatus BatteryChargeStatus
    {
        get
        {
            UpdateSystemPowerStatus();
            return (BatteryChargeStatus)systemPowerStatus.BatteryFlag;
        }
    }

    /// <summary>报告的主电池电源的完全充电寿命(以秒为单位)</summary>
    public Int32 BatteryFullLifetime
    {
        get
        {
            UpdateSystemPowerStatus();
            return systemPowerStatus.BatteryFullLifeTime;
        }
    }

    /// <summary>电池剩余电量的近似量</summary>
    public Single BatteryLifePercent
    {
        get
        {
            UpdateSystemPowerStatus();
            var num = systemPowerStatus.BatteryLifePercent / 100f;
            return num > 1f ? 1f : num;
        }
    }

    /// <summary>电池的剩余使用时间的近似秒数</summary>
    public Int32 BatteryLifeRemaining
    {
        get
        {
            UpdateSystemPowerStatus();
            return systemPowerStatus.BatteryLifeTime;
        }
    }

    private void UpdateSystemPowerStatus() => GetSystemPowerStatus(ref systemPowerStatus);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    static extern Boolean GetSystemPowerStatus([In][Out] ref SYSTEM_POWER_STATUS systemPowerStatus);

    struct SYSTEM_POWER_STATUS
    {
        public Byte ACLineStatus;

        public Byte BatteryFlag;

        public Byte BatteryLifePercent;

        public Byte Reserved1;

        public Int32 BatteryLifeTime;

        public Int32 BatteryFullLifeTime;
    }
}