WPF get gpu information via System.Management

Install-Package System.Management

 

 

 private string GetGPUMem()
 {
     StringBuilder builder = new StringBuilder();
     ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from win32_videocontroller");
     foreach (var obj in searcher.Get())
     {
         builder.Append($"Name:{obj["Name"]}");
         //builder.Append($",status {obj["Status"]}");
         //builder.Append($",driver version:{obj["DriverVersion"]}");
         builder.Append($",display mem:{obj["AdapterRAM"]}");
         builder.Append($",driver date:{obj["DriverDate"]}");
     }
     return builder.ToString();
 }

 

202604082107516926,loaded 294000000 items,memory:21,024.00 M,time cost:290.7791088 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 3224 has exited with code 0 (0x0).
202604082107527619,loaded 295000000 items,memory:21,149.00 M,time cost:291.8483797 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 1112 has exited with code 0 (0x0).
202604082107537398,loaded 296000000 items,memory:21,201.00 M,time cost:292.8262953 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 23304 has exited with code 0 (0x0).
202604082107547409,loaded 297000000 items,memory:21,253.00 M,time cost:293.8274284 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 8764 has exited with code 0 (0x0).
202604082107557737,loaded 298000000 items,memory:21,304.00 M,time cost:294.8604202 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 24804 has exited with code 0 (0x0).
202604082107566268,loaded 299000000 items,memory:21,360.00 M,time cost:295.7134062 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 8944 has exited with code 0 (0x0).
202604082107574839,loaded 300000000 items,memory:21,414.00 M,time cost:296.5706395 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread 8964 has exited with code 0 (0x0).
202604082107575545,loaded 300000001 items,memory:21,414.00 M,time cost:296.6428691 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000
The thread '.NET TP Worker' (2856) has exited with code 0 (0x0).

 

 

image

 

 

<Window x:Class="WpfApp13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp13"
        mc:Ignorable="d"
         WindowState="Maximized"
        Title="{Binding MainTitle}" Height="450" Width="800">
    <Window.DataContext>
        <local:MainVM/>
    </Window.DataContext>
    <Window.Resources>
        <local:ImgConverter x:Key="ImgConverter"/>
    </Window.Resources>
    <Grid>
        <ItemsControl ItemsSource="{Binding ImgsCollection}">
            <ItemsControl.Template>
                <ControlTemplate>
                    <ScrollViewer CanContentScroll="True">
                        <VirtualizingStackPanel IsItemsHost="True"
                         VirtualizingPanel.IsVirtualizing="True"
                         VirtualizingPanel.CacheLength="2,2"
                         VirtualizingPanel.CacheLengthUnit="Item"
                         VirtualizingPanel.VirtualizationMode="Recycling"
                         ScrollViewer.CanContentScroll="True"
                         ScrollViewer.IsDeferredScrollingEnabled="True"/>
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Width="{x:Static SystemParameters.FullPrimaryScreenWidth}"
                          Height="{x:Static SystemParameters.FullPrimaryScreenHeight}">
                        <Grid.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="FontSize" Value="30"/>
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="FontSize" Value="150"/>
                                        <Setter Property="Foreground" Value="Red"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </Grid.Resources>
                        <Image Source="{Binding ImgUrl,Converter={StaticResource ImgConverter}}"
                               Stretch="Uniform"/>

                        <TextBlock Text="{Binding Id}"/>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Management;
using System.Runtime.CompilerServices;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    public class MainVM : INotifyPropertyChanged
    {
        DateTime startDt;
        public MainVM()
        {
            Task.Run(async () =>
            {
                await InitImgsCollection(300000001);
            });
        }

        private async Task InitImgsCollection(int cnt = 100000001)
        {
            var imgDir = @"../../../Images";
            if (!Directory.Exists(imgDir))
            {
                return;
            }
            var imgs = Directory.GetFiles(imgDir);
            if (imgs == null || !imgs.Any())
            {
                return;
            }

            int imgsCnt = imgs.Count();
            ImgsCollection = new ObservableCollection<ImgModel>();
            List<ImgModel> imgsList = new List<ImgModel>();
            startDt = DateTime.Now;
            for (int i = 1; i < cnt + 1; i++)
            {
                imgsList.Add(new ImgModel()
                {
                    Id = i,
                    //Name = $"Name_{i}",
                    //ISBN = $"ISBN_{i}_{Guid.NewGuid():N}",
                    ImgUrl = imgs[i % imgsCnt]
                });

                if (i % 1000000 == 0)
                {
                    await PopulateImgsCollectionAsync(imgsList);
                }
            }

            if (imgsList.Any())
            {
                await PopulateImgsCollectionAsync(imgsList);
            }
        }

        private async Task PopulateImgsCollectionAsync(List<ImgModel> imgsList)
        {
            var tempList = imgsList.ToList();
            imgsList.Clear();
            await Application.Current.Dispatcher.InvokeAsync(() =>
            {
                foreach (var img in tempList)
                {
                    ImgsCollection.Add(img);
                }
                MainTitle = $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")},loaded {ImgsCollection.Count} items,memory:{GetMem()},time cost:{DateTime.Now.Subtract(startDt).TotalSeconds} seconds,{GetGPUMem()}";
                System.Diagnostics.Debug.WriteLine(MainTitle);
            }, System.Windows.Threading.DispatcherPriority.Background);
        }

        private string GetMem()
        {
            return $"{System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024:N2} M";
        }

        private string GetGPUMem()
        {
            StringBuilder builder = new StringBuilder();
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from win32_videocontroller");
            foreach (var obj in searcher.Get())
            {
                builder.Append($"Name:{obj["Name"]}");
                //builder.Append($",status {obj["Status"]}");
                //builder.Append($",driver version:{obj["DriverVersion"]}");
                builder.Append($",display mem:{obj["AdapterRAM"]}");
                builder.Append($",driver date:{obj["DriverDate"]}");
            }
            return builder.ToString();
        }

        private ObservableCollection<ImgModel> imgsCollection;
        public ObservableCollection<ImgModel> ImgsCollection
        {
            get
            {
                return imgsCollection;
            }
            set
            {
                if (value != imgsCollection)
                {
                    imgsCollection = value;
                    OnPropertyChanged();
                }
            }
        }

        private string mainTitle = "";
        public string MainTitle
        {
            get
            {
                return mainTitle;
            }
            set
            {
                if (value != mainTitle)
                {
                    mainTitle = value;
                    OnPropertyChanged();
                }
            }
        }
        public event PropertyChangedEventHandler? PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string propName = "")
        {
            var handler = PropertyChanged;
            handler?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }

    public class ImgConverter : IValueConverter
    {
        private Dictionary<string, ImageSource> imgCache = new Dictionary<string, ImageSource>();
        private readonly object objLock = new object();
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var imgUrl = value?.ToString();
            if (string.IsNullOrWhiteSpace(imgUrl) || !File.Exists(imgUrl))
            {
                return null;
            }

            lock (objLock)
            {
                if (imgCache.TryGetValue(imgUrl, out ImageSource img))
                {
                    return img;
                }

                using (FileStream fs = new FileStream(imgUrl, FileMode.Open, FileAccess.Read))
                {
                    BitmapImage bmi = new BitmapImage();
                    bmi.BeginInit();
                    bmi.StreamSource = fs;
                    bmi.CacheOption = BitmapCacheOption.OnLoad;
                    bmi.EndInit();
                    if (bmi.CanFreeze)
                    {
                        bmi.Freeze();
                    }

                    imgCache.TryAdd(imgUrl, bmi);
                    return bmi;
                }
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }

    public class ImgModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ISBN { get; set; }
        public string ImgUrl { get; set; }
    }
}

 

image

 

 

image

 

 

 

 

 

image

 

posted @ 2026-04-08 21:15  FredGrit  阅读(1)  评论(0)    收藏  举报