Hasan Alp Güngör

· Hasan Alp Güngör

Yeni bir Windows bilgisayarı tek tıkla kurmak: winget ve canlı donanım grafikleri

PcProgramKurucu'yu nasıl yaptım: 73 programı winget ile arka planda kurmak, arayüzü dondurmamak, Intel ve AMD'de sıcaklık sensörünü bulmak ve 73 kartı akıcı kaydırmak.

Her yeni bilgisayar kurduğumda aynı şeyi yapıyordum: tarayıcıyı açıp Chrome'u, Steam'i, Discord'u, VS Code'u tek tek indirmek ve kurulum sihirbazlarında "İleri"ye basmak. Bunu tek tıka indirmek için PcProgramKurucu'yu yazdım. C# ve Windows Forms ile yazılmış bir uygulama; sık kullanılan 73 programı listeliyor, yanında da bilgisayarın donanımını canlı grafiklerle gösteriyor.

winget: kurulum sihirbazı olmadan kurmak

Windows'un kendi paket yöneticisi winget, bir programı tek komutla indirip sessizce kurabiliyor. Her programın winget-pkgs deposunda bir kimliği var (Google.Chrome, Valve.Steam, Microsoft.VisualStudioCode gibi). Listedeki 73 programın hepsini bu depodaki gerçek kimliklerle eşleştirdim. "İndir" butonuna basınca uygulama arka planda şu komutu çalıştırıyor:

bashwinget install --id Google.Chrome -e --accept-package-agreements --accept-source-agreements

-e tam eşleşme demek; yanlışlıkla adı benzeyen başka bir paketi kurmasını engelliyor. Son iki parametre de lisans onaylarını otomatik kabul ediyor, böylece kurulum yarıda soru sorup takılmıyor.

Arayüzü dondurmamak

Bir kurulum dakikalar sürebiliyor. Komutu doğrudan çalıştırsaydım, kurulum bitene kadar bütün pencere donardı. Bu yüzden winget'i görünmez bir konsolda, ayrı bir iş parçacığında başlatıyorum ve bitmesini await ile bekliyorum. Bu sırada arayüz çalışmaya devam ediyor: sağdaki panelde programın adı, logosu ve bir ilerleme çubuğu görünüyor. Kurulum bitince çıkış koduna bakıyorum; 0 değilse winget'in kendi çıktısını hata penceresinde gösteriyorum.

csharpawait Task.Run(() =>
{
    var process = new Process();
    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.Arguments = $"/c winget install --id {wingetId} -e --accept-package-agreements --accept-source-agreements";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.Start();

    output = process.StandardOutput.ReadToEnd();
    errors = process.StandardError.ReadToEnd();
    process.WaitForExit();
    exitCode = process.ExitCode;
});

Uygulama yönetici olarak açılıyor; programların bilgisayarın tamamına kurulabilmesi ve donanım sensörlerinin okunabilmesi için bu gerekiyor.

Intel ve AMD'de sıcaklık sensörünü bulmak

Donanım bilgisi için LibreHardwareMonitor kütüphanesini kullanıyorum. İşlemci yükünü okumak kolay, ama sıcaklıkta bir sorun çıktı: sensörlerin adı üreticiye göre değişiyor. Intel işlemcilerde genelde "Core Average" var; AMD Ryzen'de bu yok, onun yerine "CPU Package" ya da "Core (Tctl/Tdie)" gibi adlar geçiyor. Çözüm olarak bilinen adları sırayla deniyorum, hiçbiri yoksa bulduğum ilk sıcaklık sensörünü kullanıyorum:

csharpstring[] knownNames = { "Core Average", "CPU Package", "Core (Tctl/Tdie)", "Core Max" };
ISensor tempSensor = null;
foreach (var name in knownNames)
{
    tempSensor = cpu.Sensors.FirstOrDefault(s => s.SensorType == SensorType.Temperature && s.Name == name);
    if (tempSensor != null) break;
}
if (tempSensor == null)
    tempSensor = cpu.Sensors.FirstOrDefault(s => s.SensorType == SensorType.Temperature);

Ekran kartında işler daha kolay: NVIDIA ve AMD kartlarda yük ve sıcaklık "GPU Core" adıyla geliyor. Disk etkinliği için Windows'un kendi performans sayacını (PhysicalDisk, % Disk Time) kullanıyorum. Bütün değerler saniyede bir güncelleniyor ve grafikler son 40 ölçümü gösteriyor.

73 kartı akıcı kaydırmak

İlk sürümde her program için ayrı bir kart kontrolü vardı ve Windows'un kendi kaydırma çubuğunu kullanıyordum. 73 kartla kaydırma takılıyor, kaydırma çubuğu da içerikle senkronunu kaybediyordu. Sonunda bütün listeyi tek bir kontrol olarak yeniden yazdım: kartların hepsini tek bir Paint çağrısında kendim çiziyorum ve kendi ince kaydırma çubuğumu kullanıyorum. Fare tekerleği, çubuğu sürükleme ve çubuğun boş kısmına tıklama hepsi çalışıyor; liste artık akıcı kayıyor.

Programların logolarını Google'ın favicon servisinden, her programın web sitesinin alan adıyla çekiyorum; 73 logo dosyasını uygulamanın içine gömmek zorunda kalmadım. Uygulama tek bir exe olarak geliyor (kullandığı kütüphaneler Costura.Fody ile içine gömülü) ve açılışta GitHub'da yeni bir sürüm olup olmadığına bakıyor. Kodun tamamı GitHub'da.

Diğer yazılar