Usuário com melhor resposta
CAPTURAR MEMORIA RAM DO COMPUTADOR - C#

Pergunta
-
Estou utilizando o seguinte código:
ManagementObjectSearcher s4 = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory"); foreach (ManagementObject mo in s4.Get()) txtTW_MemoriaRAM.Text = Convert.ToString(mo["Capacity"]); double memoriaRam = Convert.ToDouble(txtTW_MemoriaRAM.Text); double memoriaRamTotal = 0; memoriaRamTotal = memoriaRam / 1024 / 1024; txtTW_MemoriaRAM.Text = Convert.ToString(memoriaRamTotal);
Com o mesmo eu consigo capturar, mas somente a memória instalada em um slot, e não em todos. Ex.: Se eu tiver um computador com dois slots e cada um instalado um pente de memória de 2GB somando 4GB total, quando executado o algoritmo acima somente pega a quantidade de memória instalada em um slot, no caso 2GB.
Gostaria que alguém melhorasse o código para pegar a capacidade de memória total do computador, e não de um só slot.
Agradeço desde já pelas colaborações!
Respostas
-
Ola, fiz os testes com o exemplo que você passou e no meu caso ele capturou normal a RAM da máquina, você esta usando alguma máquina virtual ou algo assim?
using System; using System.Collections.Generic; using System.Linq; using System.Management; using System.Text; namespace Console_MemoryCatch { class Program { static void Main(string[] args) { MemoriaFisicaTotalInstalada(); Console.WriteLine(); MemoriaEmUso(); Console.WriteLine(); DisplayTotalRam(); Console.ReadLine(); } private static void MemoriaFisicaTotalInstalada() { ManagementObjectSearcher s4 = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory"); string resp = "0"; foreach (ManagementObject mo in s4.Get()) resp = Convert.ToString(mo["Capacity"]); double memoriaRam = Convert.ToDouble(resp); double memoriaRamTotal = 0; memoriaRamTotal = memoriaRam / 1024 / 1024; Console.WriteLine("Total RAM instalado:" + Convert.ToString(memoriaRamTotal)); Console.WriteLine("You have {0} bytes of RAM", new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory); } private static void MemoriaEmUso() { System.Diagnostics.PerformanceCounter ramCounter; ramCounter = new System.Diagnostics.PerformanceCounter("Memory", "Available MBytes"); Console.WriteLine("Memória em uso: " + ramCounter.NextValue() + "Mb"); } private static void DisplayTotalRam() { string Query = "SELECT MaxCapacity FROM Win32_PhysicalMemoryArray"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query); foreach (ManagementObject WniPART in searcher.Get()) { UInt32 SizeinKB = Convert.ToUInt32(WniPART.Properties["MaxCapacity"].Value); UInt32 SizeinMB = SizeinKB / 1024; UInt32 SizeinGB = SizeinMB / 1024; Console.WriteLine("Memória disponível PC --> Size in KB: {0}, Size in MB: {1}, Size in GB: {2}", SizeinKB, SizeinMB, SizeinGB); } } } }
Veja que quando imprime na tela usando ComputerInfo o resultado foi diferente, a primeira impressão também não veio correta no meu caso. Faça um teste e veja se é apresentado de uma forma diferente.
Rodrigo Reis Ferreira
Microsoft Certified- Marcado como Resposta Deividy Alcantara domingo, 3 de abril de 2016 18:15
Todas as Respostas
-
Ola, fiz os testes com o exemplo que você passou e no meu caso ele capturou normal a RAM da máquina, você esta usando alguma máquina virtual ou algo assim?
using System; using System.Collections.Generic; using System.Linq; using System.Management; using System.Text; namespace Console_MemoryCatch { class Program { static void Main(string[] args) { MemoriaFisicaTotalInstalada(); Console.WriteLine(); MemoriaEmUso(); Console.WriteLine(); DisplayTotalRam(); Console.ReadLine(); } private static void MemoriaFisicaTotalInstalada() { ManagementObjectSearcher s4 = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory"); string resp = "0"; foreach (ManagementObject mo in s4.Get()) resp = Convert.ToString(mo["Capacity"]); double memoriaRam = Convert.ToDouble(resp); double memoriaRamTotal = 0; memoriaRamTotal = memoriaRam / 1024 / 1024; Console.WriteLine("Total RAM instalado:" + Convert.ToString(memoriaRamTotal)); Console.WriteLine("You have {0} bytes of RAM", new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory); } private static void MemoriaEmUso() { System.Diagnostics.PerformanceCounter ramCounter; ramCounter = new System.Diagnostics.PerformanceCounter("Memory", "Available MBytes"); Console.WriteLine("Memória em uso: " + ramCounter.NextValue() + "Mb"); } private static void DisplayTotalRam() { string Query = "SELECT MaxCapacity FROM Win32_PhysicalMemoryArray"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query); foreach (ManagementObject WniPART in searcher.Get()) { UInt32 SizeinKB = Convert.ToUInt32(WniPART.Properties["MaxCapacity"].Value); UInt32 SizeinMB = SizeinKB / 1024; UInt32 SizeinGB = SizeinMB / 1024; Console.WriteLine("Memória disponível PC --> Size in KB: {0}, Size in MB: {1}, Size in GB: {2}", SizeinKB, SizeinMB, SizeinGB); } } } }
Veja que quando imprime na tela usando ComputerInfo o resultado foi diferente, a primeira impressão também não veio correta no meu caso. Faça um teste e veja se é apresentado de uma forma diferente.
Rodrigo Reis Ferreira
Microsoft Certified- Marcado como Resposta Deividy Alcantara domingo, 3 de abril de 2016 18:15
-
Para pegar o total.. basta somar as memoria instaladas nos slot.. você me ajudou e consegui o resultado fazendo esta alteração:
ManagementObjectSearcher s4 = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory"); string resp = "0"; double memoriaRam = 0; //Somando as mémorias foreach (ManagementObject mo in s4.Get()) { resp = Convert.ToString(mo["Capacity"]); memoriaRam += Convert.ToDouble(resp); } //Dividi 3 vezes por 1024 para pegar em gigas double memoriaRamTotal = 0; memoriaRamTotal = memoriaRam / 1024 / 1024 / 1024; lblMemoriaRam.Text = "Memória RAM: " + memoriaRamTotal + " GB";