none
CAPTURAR MEMORIA RAM DO COMPUTADOR - C# RRS feed

  • 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!

    domingo, 3 de abril de 2016 12:00

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

    domingo, 3 de abril de 2016 16:02

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

    domingo, 3 de abril de 2016 16:02
  • 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";

    segunda-feira, 20 de dezembro de 2021 19:48