· Hasan Alp Güngör
Sette opp en ny Windows-PC med ett klikk: winget og live maskinvaregrafer
Slik bygde jeg PcProgramKurucu: installere 73 programmer med winget i bakgrunnen, holde vinduet responsivt, finne temperatursensoren på Intel og AMD, og rulle 73 kort jevnt.
- C#
- WinForms
- winget
- LibreHardwareMonitor

Hver gang jeg satte opp en ny PC, gjorde jeg det samme: åpnet en nettleser, lastet ned Chrome, Steam, Discord og VS Code én etter én, og trykket "Neste" gjennom hvert installasjonsprogram. Jeg skrev PcProgramKurucu ("PC-programinstallerer") for å gjøre det til ett klikk. Det er en C# Windows Forms-app som viser 73 vanlige programmer, og ved siden av viser den PC-ens maskinvare i live grafer.
winget: installere uten installasjonsveiviseren
winget, Windows sin egen pakkebehandler, kan laste ned et program og installere det stille med én kommando. Hvert program har en ID i winget-pkgs-depotet (som Google.Chrome, Valve.Steam eller Microsoft.VisualStudioCode). Jeg koblet alle de 73 programmene i listen til de ekte ID-ene der. Når du trykker på nedlastingsknappen, kjører appen denne kommandoen i bakgrunnen:
bashwinget install --id Google.Chrome -e --accept-package-agreements --accept-source-agreements-e betyr eksakt treff, så den installerer aldri en pakke med et lignende navn ved en feil. De to siste flaggene godtar lisensavtalene på forhånd, så installasjonen aldri stopper halvveis for å stille et spørsmål.
Holde vinduet responsivt
En installasjon kan ta flere minutter. Hvis jeg kjørte kommandoen direkte, ville hele vinduet fryse til den var ferdig. Derfor starter jeg winget i en skjult konsoll på en egen tråd og venter på den med await. Imens fortsetter grensesnittet å fungere: et sidepanel viser programmets navn, logo og en fremdriftslinje. Når den er ferdig, sjekker jeg avslutningskoden, og hvis den ikke er 0, viser jeg winget sin egen utdata i en feilmelding.
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;
});Appen starter med administratorrettigheter; det trengs både for å installere programmer for hele maskinen og for å lese maskinvaresensorene.
Finne temperatursensoren på Intel og AMD
For maskinvaredata bruker jeg biblioteket LibreHardwareMonitor. Å lese CPU-belastningen er enkelt, men temperaturen hadde en hake: sensornavnene varierer etter produsent. Intel-prosessorer har vanligvis "Core Average"; AMD Ryzen har ikke det, og bruker navn som "CPU Package" eller "Core (Tctl/Tdie)" i stedet. Løsningen min er å prøve de kjente navnene i rekkefølge, og hvis ingen finnes, bruke den første temperatursensoren jeg finner:
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);Skjermkortet er enklere: på NVIDIA- og AMD-kort kommer både belastning og temperatur under navnet "GPU Core". For diskaktivitet bruker jeg Windows sin egen ytelsesteller (PhysicalDisk, % Disk Time). Alle verdier oppdateres én gang i sekundet, og grafene viser de siste 40 målingene.
Rulle 73 kort jevnt
Den første versjonen hadde en egen kortkontroll for hvert program og brukte Windows sin innebygde rullefelt. Med 73 kort hakket rullingen, og rullefeltet mistet stadig synkroniseringen med innholdet. Til slutt skrev jeg hele listen om til én kontroll: jeg tegner alle kortene selv i ett Paint-kall og bruker mitt eget tynne rullefelt. Musehjulet, å dra i rullefeltet og å klikke på sporet fungerer, og listen ruller nå jevnt.
Programlogoene hentes fra Googles favicon-tjeneste med domenet til hvert programs nettsted, så jeg slapp å legge ved 73 logofiler i appen. Appen kommer som én exe (bibliotekene er bygd inn med Costura.Fody) og sjekker GitHub for en ny versjon ved oppstart. All koden ligger på GitHub.


