我正在尝试通过Visual Basic安装在我的电脑上的物理内存量(总RAM)。问题是我得到一个返回“0字节”。此外我还会尝试你得到百分比在Windows中使用的,可用RAM的数量,总页面数,免费页面和显示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。我怎么能这样做。非常感谢你。
答案 0 :(得分:2)
完成工作的一些简单的单行:
的 TotalPhysicalMemory 强> 的
MsgBox(String.Format("TotalPhysicalMemory: {0} MBytes", System.Math.Round(My.Computer.Info.TotalPhysicalMemory / (1024 * 1024)), 2).ToString)
的 AvailablePhysicalMemory 强> 的
MsgBox(String.Format("AvailablePhysicalMemory: {0} MBytes", System.Math.Round(My.Computer.Info.AvailablePhysicalMemory / (1024 * 1024)), 2).ToString)
的 TotalVirtualMemory 强> 的
MsgBox(String.Format("TotalVirtualMemory: {0} MBytes", System.Math.Round(My.Computer.Info.TotalVirtualMemory / (1024 * 1024)), 2).ToString)
的 AvailableVirtualMemory 强> 的
MsgBox(String.Format("AvailableVirtualMemory: {0} MBytes", System.Math.Round(My.Computer.Info.AvailableVirtualMemory / (1024 * 1024)), 2).ToString)
或
将您的API转换为此(请注意代码中缺少.dll
)
Private Declare Auto Sub GlobalMemoryStatusEx Lib "kernel32.dll" (ByRef lpBuffer As MEMORYSTATUSEX)
答案 1 :(得分: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))
答案 2 :(得分: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