1

我正在尝试通过 Visual Basic 获取安装在我的 PC 上的物理内存量(总 RAM)。问题是我得到的返回“0 字节”。此外,我还将尝试获取使用百分比,可用 RAM 的数量、总分页、可用页面和显示使用情况的图表,如 Windows 中的 RAM 资源监视器。问题是我无法首先获得正确数量的可用 RAM 以与其他人一起推进。

我做错了什么?谢谢你。

这是我的代码:

Option Strict On
Option Explicit On
Imports System.Math
Imports System.Management
Imports System.Runtime.InteropServices
Public Class Form1
    Inherits System.Windows.Forms.Form
#Region " API "
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    Private Structure MEMORYSTATUSEX
        Dim dwLength As Integer
        Dim dwMemoryLoad As Integer
        Dim ullTotalPhys As ULong
    End Structure
    Private memoryInfo As MEMORYSTATUSEX
    Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32" (ByRef lpBuffer As MEMORYSTATUSEX)
#End Region


#Region " Variables "

    Private mullTotalRAM As ULong

#End Region

#Region " Form Events "
    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        ' set title
        Me.Text = My.Application.Info.Title & " " & My.Application.Info.Version.Major.ToString & "." & _
            My.Application.Info.Version.Minor.ToString

        Application.DoEvents()
        GetMemoryInfo()
        Timer1.Enabled = True
    End Sub

#End Region

#Region " Information Gathering and Display "

    Private Sub GetMemoryInfo()

        System.Windows.Forms.Application.DoEvents()

        ' set size of structure (required by this api call)
        memoryInfo.dwLength = Marshal.SizeOf(memoryInfo)
        GlobalMemoryStatusEx(memoryInfo)

        mullTotalRAM = memoryInfo.ullTotalPhys

        txtRAM.Text = FormatBytes(mullTotalRAM)

    End Sub

#End Region

#Region " Update Timer "

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)

        GetMemoryInfo()

        Application.DoEvents()

    End Sub

#End Region


#Region " Formatting Routines "

    Private Function FormatBytes(ByVal ullBytes As ULong) As String
        Dim dblTemp As Double

        Try
            Select Case ullBytes
                Case Is >= 1073741824 'GB
                    dblTemp = CDbl(ullBytes / 1073741824)
                    Return FormatNumber(dblTemp, 2) & " GB"
                Case 1048576 To 1073741823
                    dblTemp = CDbl(ullBytes / 1048576) 'MB
                    Return FormatNumber(dblTemp, 0) & " MB"
                Case 1024 To 1048575
                    dblTemp = CDbl(ullBytes / 1024) 'KB
                    Return FormatNumber(dblTemp, 0) & " KB"
                Case 0 To 1023
                    dblTemp = ullBytes ' bytes
                    Return FormatNumber(dblTemp, 0) & " bytes"
                Case Else
                    Return ""
            End Select
        Catch
            Return ""
        End Try

    End Function


#End Region


    Private Sub ramaTotalRAM_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ramaTotalRAM.Enter

    End Sub

    Private Sub txtRAM_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtRAM.TextChanged

    End Sub
End Class

我已经解决了这个问题。现在我想知道是否可以制作这样的东西: http : //s18.postimage.org/7zn5adst3/Memory.jpg 。我该怎么做。非常感谢。

4

3 回答 3

3

一些简单的单班轮来完成工作:

总物理内存

MsgBox(String.Format("TotalPhysicalMemory: {0} MBytes", System.Math.Round(My.Computer.Info.TotalPhysicalMemory / (1024 * 1024)), 2).ToString)

可用物理内存

    MsgBox(String.Format("AvailablePhysicalMemory: {0} MBytes", System.Math.Round(My.Computer.Info.AvailablePhysicalMemory / (1024 * 1024)), 2).ToString)

总虚拟内存

    MsgBox(String.Format("TotalVirtualMemory: {0} MBytes", System.Math.Round(My.Computer.Info.TotalVirtualMemory / (1024 * 1024)), 2).ToString)

可用虚拟内存

    MsgBox(String.Format("AvailableVirtualMemory: {0} MBytes", System.Math.Round(My.Computer.Info.AvailableVirtualMemory / (1024 * 1024)), 2).ToString)

或者

将您的 API decl 更改为此(请注意.dll您的代码中缺少此内容)

Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32.dll" (ByRef lpBuffer As MEMORYSTATUSEX)
于 2012-07-04T06:56:34.430 回答
0

这是工作示例的pastebin

我能够通过使用以下定义来使其GlobalMemoryStatusEx工作MEMORYSTATUSEX

Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32" (<[In](), Out()> lpBuffer As MEMORYSTATUSEX)

并声明它像

 Private memoryInfo As MEMORYSTATUSEX = New MEMORYSTATUSEX

并注释掉

 'memoryInfo.dwLength = CUInt(Marshal.SizeOf(memoryInfo)) 

我不知道你从哪里得到你的结构定义,MEMORYSTATUSEX但根据 Pinvoke.net 它应该是。

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Class MEMORYSTATUSEX

    ''' <summary>
    ''' Initializes a new instance of the <see cref="T:MEMORYSTATUSEX" /> class.
    ''' </summary>
    Public Sub New()
    Me.dwLength = CType(Marshal.SizeOf(GetType(MEMORYSTATUSEX)), UInt32)
    End Sub
    ' Fields
    ''' <summary>
    ''' Size of the structure, in bytes. You must set this member before calling GlobalMemoryStatusEx.
    ''' </summary>
    Public dwLength As UInt32
    ''' <summary>
    ''' Number between 0 and 100 that specifies the approximate percentage of physical memory that is in use (0 indicates no memory use and 100 indicates full memory use).
    ''' </summary>
    Public dwMemoryLoad As UInt32
    ''' <summary>
    ''' Total size of physical memory, in bytes.
    ''' </summary>
    Public ullTotalPhys As UInt64
    ''' <summary>
    ''' Size of physical memory available, in bytes.
    ''' </summary>
    Public ullAvailPhys As UInt64
    ''' <summary>
    ''' Size of the committed memory limit, in bytes. This is physical memory plus the size of the page file, minus a small overhead.
    ''' </summary>
    Public ullTotalPageFile As UInt64
    ''' <summary>
    ''' Size of available memory to commit, in bytes. The limit is ullTotalPageFile.
    ''' </summary>
    Public ullAvailPageFile As UInt64
    ''' <summary>
    ''' Total size of the user mode portion of the virtual address space of the calling process, in bytes.
    ''' </summary>
    Public ullTotalVirtual As UInt64
    ''' <summary>
    ''' Size of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process, in bytes.
    ''' </summary>
    Public ullAvailVirtual As UInt64
    ''' <summary>
    ''' Size of unreserved and uncommitted memory in the extended portion of the virtual address space of the calling process, in bytes.
    ''' </summary>
    Public ullAvailExtendedVirtual As UInt64
End Class

您还可以查看Microsoft.VisualBasic.Devices.ComputerInfo

Dim info As Microsoft.VisualBasic.Devices.ComputerInfo = New Microsoft.VisualBasic.Devices.ComputerInfo 
Debug.Print(CStr(info.TotalPhysicalMemory))
Debug.Print(CStr(info.TotalVirtualMemory))
Debug.Print(CStr(info.AvailablePhysicalMemory))
于 2012-07-04T06:22:53.203 回答
0
Friend Sub ReleaseMemory()
        Try
            GC.Collect()
            GC.WaitForPendingFinalizers()
            If Environment.OSVersion.Platform = PlatformID.Win32NT Then
                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1)
            End If
        Catch ex As Exception
            LogError(ex.ToString())
        End Try
    End Sub
于 2013-07-01T06:51:35.657 回答