87 lines
3.6 KiB
C#
87 lines
3.6 KiB
C#
using CZGL.SystemInfo.Memory;
|
||
using System;
|
||
using System.Runtime.InteropServices;
|
||
|
||
namespace CZGL.SystemInfo
|
||
{
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public partial class WindowsMemory
|
||
{
|
||
|
||
#if NET7_0_OR_GREATER
|
||
|
||
/// <summary>
|
||
/// 在内存超过 4 GB 的计算机上, GlobalMemoryStatus函数可能返回不正确的信息,报告值 –1 表示溢出。因此,应用程序应改用 GlobalMemoryStatusEx函数。
|
||
/// </summary>
|
||
/// <remarks>Windows XP [仅限桌面应用程序];最低支持服务器 Windows Server 2003 [仅限桌面应用程序]</remarks>
|
||
/// <param name="lpBuffer"></param>
|
||
[LibraryImport("Kernel32.dll", SetLastError = true)]
|
||
public static partial void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
|
||
|
||
/// <summary>
|
||
/// 检索有关系统当前使用物理和虚拟内存的信息
|
||
/// </summary>
|
||
/// <remarks><see href="https://docs.microsoft.com/zh-cn/windows/win32/api/sysinfoapi/nf-sysinfoapi-globalmemorystatusex"/></remarks>
|
||
/// <param name="lpBuffer"></param>
|
||
/// <returns></returns>
|
||
[LibraryImport("Kernel32.dll", SetLastError = true)]
|
||
[return: MarshalAs(UnmanagedType.Bool)]
|
||
public static partial Boolean GlobalMemoryStatusEx(ref MemoryStatusExE lpBuffer);
|
||
|
||
#else
|
||
|
||
|
||
/// <summary>
|
||
/// 在内存超过 4 GB 的计算机上, GlobalMemoryStatus函数可能返回不正确的信息,报告值 –1 表示溢出。因此,应用程序应改用 GlobalMemoryStatusEx函数。
|
||
/// </summary>
|
||
/// <remarks>Windows XP [仅限桌面应用程序];最低支持服务器 Windows Server 2003 [仅限桌面应用程序]</remarks>
|
||
/// <param name="lpBuffer"></param>
|
||
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||
public static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
|
||
|
||
/// <summary>
|
||
/// 检索有关系统当前使用物理和虚拟内存的信息
|
||
/// </summary>
|
||
/// <remarks><see href="https://docs.microsoft.com/zh-cn/windows/win32/api/sysinfoapi/nf-sysinfoapi-globalmemorystatusex"/></remarks>
|
||
/// <param name="lpBuffer"></param>
|
||
/// <returns></returns>
|
||
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||
[return: MarshalAs(UnmanagedType.Bool)]
|
||
public static extern Boolean GlobalMemoryStatusEx(ref MemoryStatusExE lpBuffer);
|
||
#endif
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static MemoryValue GetMemory()
|
||
{
|
||
// 检查 Windows 内核版本,是否为旧系统
|
||
if (Environment.OSVersion.Version.Major < 5)
|
||
{
|
||
// https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions");
|
||
return default;
|
||
}
|
||
|
||
MemoryStatusExE memoryStatusEx = new MemoryStatusExE();
|
||
// 初始化结构的大小
|
||
memoryStatusEx.Init();
|
||
// 刷新值
|
||
if (!GlobalMemoryStatusEx(ref memoryStatusEx)) return default;
|
||
|
||
var TotalPhysicalMemory = memoryStatusEx.ullTotalPhys;
|
||
var AvailablePhysicalMemory = memoryStatusEx.ullAvailPhys;
|
||
var TotalVirtualMemory = memoryStatusEx.ullTotalVirtual;
|
||
var AvailableVirtualMemory = memoryStatusEx.ullAvailVirtual;
|
||
var UsedPercentage = memoryStatusEx.dwMemoryLoad;
|
||
return new MemoryValue(
|
||
TotalPhysicalMemory,
|
||
AvailablePhysicalMemory,
|
||
UsedPercentage,
|
||
TotalVirtualMemory,
|
||
AvailableVirtualMemory);
|
||
}
|
||
}
|
||
}
|