[StructLayout(LayoutKind.Sequential)]

    public struct PPROCESS_MEMORY_COUNTERS
    {
        /// <summary>
        /// 结构体大小
        /// </summary>
        public UInt32 cb;

        /// <summary>
        /// 缺页中断次数
        /// </summary>
        public UInt32 PageFaultCount;

        /// <summary>
        /// 使用内存高峰
        /// </summary>
        public UInt32 PeakWorkingSetSize;

        /// <summary>
        /// 当前使用的内存
        /// </summary>
        public UInt32 WorkingSetSize;

        /// <summary>
        /// 使用页面缓存池高峰
        /// </summary>
        public UInt32 QuotaPeakPagedPoolUsage;

        /// <summary>
        /// 使用页面缓存池
        /// </summary>
        public UInt32 QuotaPagedPoolUsage;

        /// <summary>
        /// 使用非分页缓存池高峰
        /// </summary>
        public UInt32 QuotaPeakNonPagedPoolUsage;

        /// <summary>
        /// 使用非分页缓存池
        /// </summary>
        public UInt32 QuotaNonPagedPoolUsage;

        /// <summary>
        /// 使用分页文件
        /// </summary>
        public UInt32 PagefileUsage;

        /// <summary>
        /// 使用分页文件的高峰
        /// </summary>
        public UInt32 PeakPagefileUsage;
    }

 

        /// <summary>
        /// Retrieves the calling thread's last-error code value.
        /// </summary>
        /// <returns>The return value is the calling thread's last-error code.</returns>
        [System.Runtime.InteropServices.DllImport("Kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        internal static extern Int32 GetLastError();

               /// <summary>
        /// Retrieves information about the memory usage of the specified process.
        /// </summary>
        /// <param name="hProcess">A handle to the process. The handle must have the PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION access right and the PROCESS_VM_READ access right. </param>
        /// <param name="lpCreationTime">A pointer to the PROCESS_MEMORY_COUNTERS or PROCESS_MEMORY_COUNTERS_EX structure that receives information about the memory usage of the process. </param>
        /// <param name="cb">The size of the ppsmemCounters structure, in bytes. </param>
        /// <returns>If the function succeeds, the return value is nonzero.</returns>
        [System.Runtime.InteropServices.DllImport("Psapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true, EntryPoint = "GetProcessMemoryInfo")]
        internal static extern int GetProcessMemoryInfo(IntPtr hProcess, out PPROCESS_MEMORY_COUNTERS ppsmemCounters, Int32 cb);

 

 

        /// <summary>
        /// Gets the memory information.
        /// </summary>
        /// <param name="errorCode">The error code.</param>
        /// <returns></returns>
        public static PPROCESS_MEMORY_COUNTERS GetMemoryInformation(out int errorCode)
        {
            errorCode = 0;
            PPROCESS_MEMORY_COUNTERS memoryInfo;
            if (NativeMethods.GetProcessMemoryInfo(HelpViewerProcess.Handle, out memoryInfo, System.Runtime.InteropServices.Marshal.SizeOf(typeof(PPROCESS_MEMORY_COUNTERS))) != 1)
            {
                errorCode = NativeMethods.GetLastError();
            }
            return memoryInfo;
        }