WMI Wert in der Ausgabe verändern

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
cantius
Beiträge: 11
Registriert: Sa Mär 23, 2013 7:00 pm

WMI Wert in der Ausgabe verändern

Beitrag von cantius » Di Mär 26, 2013 2:26 pm

Hallo ihr Kanarienvögel :lol:

Ich habe eine kurze Frage. Ich habe die WMI Werte vom Prozessor ausgelesen (Code unten) und auch in einer Textbox ausgegeben. Das klappt auch alles wunderbar.
In meinem Fall gibt er bei Name: Intel(R) Core(TM) i5-3570K CPU @ 3.40Ghz aus.

Allerdings möchte ich erstmal nur den Namen alleine haben, also Intel Core i5-3570K gibts da Möglichkeiten diesen Wert zu verändern, in der Textbox wohlbemerkt.

Achja, den Wert KÖNNTE ich auch aus der Registry lesen. Vielleicht würde das ja sogar noch einfacher gehen, den zu ändern.

Danke :)

Code: Alles auswählen

public string InfProzessor()
        {      

            ManagementObjectSearcher searcher = new
                ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");

            StringBuilder sb = new StringBuilder();

            foreach (ManagementObject wmi in searcher.Get())
            {
                try
                {
                    sb.Append (wmi.GetPropertyValue("Name").ToString() +
                        Environment.NewLine);
                }
                catch
                {
                    return sb.ToString();
                }
            }
            return sb.ToString();
        }

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: WMI Wert in der Ausgabe verändern

Beitrag von cloidnerux » Di Mär 26, 2013 3:00 pm

Sobald du nen String hast, kannst du ihn auch wie ein String behandeln und entsprechend verändern. Sprich ungewollte Zeichen rausschmeißen, abschneiden, etc. Ein deinem Fall müssen alle "(R)" und "(TM)" dran glauben und vor dem "@" muss abgeschnitten werden.
Schau dir dazu die Beschreibungen und entsprechende Fachliteratur an :D
Sowas z.B: http://msdn.microsoft.com/de-de/library ... s.80).aspx
Dürfte ja nicht all zu kompliziert sein.
Redundanz macht wiederholen unnötig.
quod erat expectandum

cantius
Beiträge: 11
Registriert: Sa Mär 23, 2013 7:00 pm

Re: WMI Wert in der Ausgabe verändern

Beitrag von cantius » Mi Mär 27, 2013 1:37 am

Vielen Vielen Dank cloidnerux hat mir weiter geholfen

Hätte ich eigentlich auch selber drauf kommen können, tschuldigung :oops:

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: WMI Wert in der Ausgabe verändern

Beitrag von cloidnerux » Mi Mär 27, 2013 9:20 am

Hätte ich eigentlich auch selber drauf kommen können, tschuldigung
Kein Grund sich zu entschuldigen, manchmal sieht man den Wald vor lauter Bäumen nicht.
Redundanz macht wiederholen unnötig.
quod erat expectandum

cantius
Beiträge: 11
Registriert: Sa Mär 23, 2013 7:00 pm

Re: WMI Wert in der Ausgabe verändern

Beitrag von cantius » Mi Mär 27, 2013 3:10 pm

Ich hätte da noch eine weitere Frage. Eigentlich möchte ich gar nicht so viel nachfragen aber ich bin doch sehr ungeduldig wenn es um Probleme geht :|

Im Prinzip sollte es ganz einfach sein, da es sich EIGENTLICH immer wiederholt. Also ich lese ja die Werte mit folgendem Code aus.

Code: Alles auswählen

 public string InfProzessor()        {           

            ManagementObjectSearcher searcher = new
                ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");

            StringBuilder sb = new StringBuilder();

            foreach (ManagementObject wmi in searcher.Get())            {
                try                {
                    sb.Append(wmi.GetPropertyValue("Name").ToString() +
                        Environment.NewLine);              
                catch
                {
                    return sb.ToString();
                }
            }
            return sb.ToString();
        }
Diesen Wert übergebe ich dann einem Label

Code: Alles auswählen

this.lblCPU.Text += InfProzessor();
Ich hatte das bei der nächsten Abfrage dann vorher so "gelöst", dass ich alles nochmal kopiert habe und dann nur die Parameter verändert habe.

Code: Alles auswählen

 sb.Append(wmi.GetPropertyValue("CurrentVoltage").ToString() +
                        Environment.NewLine);
Wenn ich jetzt aber 20 Abfragen habe wird das ja ein verdammt langer Code und das möchte ich eigentlich vermeiden. Meine Idee war es jetzt, dass ich die nächste Abfrage (Die Spannung des Prozessors) auch in die Schleife setzte und dann ein anderes Label zuweise.

Das geht aber nicht da er dem Label2 genau das gleiche übergibt wie im Label1. Ist ja eigentlich auch klar :D
Wie bekomme ich das also hin, dass er die Spannung in Label2 übergibt und die Abfrage dabei in der selben Schleife liegt.

Ich habe es auch selber versucht aber das ging alles nach hinten los.

Ich bin für jede Hilfe dankbar ;)

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: WMI Wert in der Ausgabe verändern

Beitrag von GilbertDur » Mi Mär 27, 2013 4:05 pm

Kannst du mal den Schleifen-Code posten? Sonst fällt es mir gerade schwer dein Problem zu sehen :D

cantius
Beiträge: 11
Registriert: Sa Mär 23, 2013 7:00 pm

Re: WMI Wert in der Ausgabe verändern

Beitrag von cantius » Mi Mär 27, 2013 4:12 pm

Code: Alles auswählen

foreach (ManagementObject wmi in searcher.Get())
            {
                try
                {
                    sb.Append (wmi.GetPropertyValue("Name").ToString() +
                        Environment.NewLine);
                }
                catch
                {
                    return sb.ToString();
                }
            }
            return sb.ToString();
        }
Eigentlich hatte ich die Schleife ja mit dabei geschrieben aber macht ja nichts :)
Kann man denn im return mehrere Werte zurückgeben, weil falls nicht, dann wäre das ganze ja überhaupt nicht machbar aber vielleicht mach ich mir das einfach zu schwer

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: WMI Wert in der Ausgabe verändern

Beitrag von cloidnerux » Mi Mär 27, 2013 4:30 pm

Wenn du deiner Funktion als Parameter einen String übergibst, der dem Namen des gesuchten Objektes entspricht und dann Statt z.B nach "CurrentVoltage" direkt suchst, den Parameter einsetzt:

Code: Alles auswählen

public string WmiInfo(string name)        {           

            ManagementObjectSearcher searcher = new
                ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");

            StringBuilder sb = new StringBuilder();

            foreach (ManagementObject wmi in searcher.Get())            {
                try                {
                    sb.Append(wmi.GetPropertyValue(name).ToString() +
                        Environment.NewLine);              
                catch
                {
                    return sb.ToString();
                }
            }
            return sb.ToString();
        }
Und dann einfach Parametrisiert aufrufen:

Code: Alles auswählen

this.lblCPU.Text += WmiInfo("Name");
Das sollte dein Problem lösen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

cantius
Beiträge: 11
Registriert: Sa Mär 23, 2013 7:00 pm

Re: WMI Wert in der Ausgabe verändern

Beitrag von cantius » Mi Mär 27, 2013 5:06 pm

Das funktioniert soweit, allerdings wollte ich das wohl gerne das die Spannung und noch andere Abfragen, in dieser einen Funktionen sind. Das ich also nur eine Funktion habe. Ich hab das jetzt so ..

Code: Alles auswählen

 public string WmiInfo(string name, string spannung)
        {           
            ManagementObjectSearcher searcher = new
                ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");

StringBuilder sb = new StringBuilder();

              foreach (ManagementObject wmi in searcher.Get())
            {
                try                {
                    sb.Append(wmi.GetPropertyValue(name).ToString() +
                        Environment.NewLine);
                    sb.Append(wmi.GetPropertyValue(spannung).ToString() +
                        Environment.NewLine);
                }
                catch
                {
                    return sb.ToString();
                }
            }
            return sb.ToString();

Code: Alles auswählen

  this.lblCPU.Text += WmiInfo("Name")
            this.lblSpannung.Text += WmiInfo("CurrentVoltage");
Brauch ich jetzt noch einen zweiten Stringbuilder ? Wie läuft das denn dann mit dem return ?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: WMI Wert in der Ausgabe verändern

Beitrag von cloidnerux » Mi Mär 27, 2013 9:35 pm

Brauch ich jetzt noch einen zweiten Stringbuilder ? Wie läuft das denn dann mit dem return ?
Du machst es dir zu kompliziert, weil du es dir falsch vorstellst.
Wenn du dir

Code: Alles auswählen

wmi.GetPropertyValue("Name")
anschaust, siehst du, dass es einen String haben möchte, der das Element spezifiziert, dass du haben willst. In deinem Fall ist das "Name". Alles was in C# in Anführungszeichen ist, ist vom Typ string.
Die Idee ist nun also, statt jedes mal eine Funktion zu schreiben, wo du das Element in der Funktion spezifizierst, der Funktion einen Parameter zu geben, mit dem du das machen kannst.
Also statt in der Funktion direkt z.B nach "Name" zu suchen, soll beim Aufruf der Funktion erst festgelegt werden:

Code: Alles auswählen

WmiInfo("Name");     //Liefert dir den Namen des Prozessors
WmiInfo("CurrentVoltage"); //Liefert dir die Spannung
Daher brauchst du keinen zweiten Funktionsparameter oder weitere Stringbuilder oder ähnliches.
wmi.GetPropertyValue erwartet einen String, also gibst du ihm einen. Es wird ein String zurückgegeben, also wird er auch als solcher behandelt. Fertig. Orientiere dich nicht am Inhalt, sondern am Typ. Was wird gefordert und was kommt zurück.

MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten