2

これは、私の Form1 コンストラクターでメソッドを呼び出すコードです。

private void cpuFanSpeed()
        {
            SelectQuery query =
           new SelectQuery("Win32_Fan");

            // Instantiate an object searcher
            // with this query
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(query);

            // Call Get() to retrieve the collection
            // of objects and loop through it
            foreach (ManagementObject envVar in searcher.Get())
                MessageBox.Show(envVar["DesiredSpeed"].ToString());
        }

しかし、MessageBox に到達することはありません。ここで何が問題なのですか? ここのドキュメントを読んで実行しようとしました: http://msdn.microsoft.com/en-us/library/aa394146(v=vs.85).aspx

そしてここ:http://msdn.microsoft.com/en-us/library/ms257359.aspx

しかし、それは機能していません。

ラベルに 1 秒ごとに CPU ファンの速度を表示したいと考えています。

これは、CPU ファン速度を表示する OpenHardwareMonitor のスクリーンショットです。

ここに画像の説明を入力

これは、私のアプリケーションで CPU 温度を取得するために使用している関数のコードです。

クラスで:

public static float? cpuView(bool pause , CpuTemperature cpuTemp , Form1 f1 , List<string> myData , float? myCpuTemp , Button b1)
        {
            if (pause == true)
            {
            }
            else
            {
                Computer myComputer = new Computer();
                myComputer = new Computer(cpuTemp)
                {
                    CPUEnabled =

                        true
                };

                myComputer.Open();
                Trace.WriteLine("");
                foreach (var hardwareItem in myComputer.Hardware)
                {
                    if (hardwareItem.HardwareType == HardwareType.CPU)
                    {
                        hardwareItem.Update();
                        foreach (IHardware subHardware in hardwareItem.SubHardware)
                            subHardware.Update();

                        foreach (var sensor in hardwareItem.Sensors)
                        {
                            cpuTemp.SetValue("sensor", sensor.Value.ToString());
                            if (sensor.SensorType == SensorType.Temperature)
                            {
                                sensor.Hardware.Update();
                                cpuTemp.GetValue("sensor", sensor.Value.ToString());                                
                                f1.Invoke(new Action(() => myData.Add("Cpu Temeprature --- " + sensor.Value.ToString())));
                                myCpuTemp = sensor.Value;
                                if (sensor.Value > 60)
                                {


                                    Logger.Write("The Current CPU Temperature Is ===> " + sensor.Value);
                                    b1.Enabled = true;
                                }

                                break;
                            }
                        }
                    }
                }
            }
            return myCpuTemp;
        }
4

1 に答える 1

4

すべてのマシンがWMIを介してこの情報を提供するわけではありません。お使いのコンピュータがアクセスできない場合、アクセスできません。WMIが特定の情報にアクセスするためのプロパティを提供しているからといって、その情報が常に利用可能であるとは限りません。

おそらく、foreachループ内で繰り返し処理しているコレクションはMessageBoxであるため、表示されません。

この問題の唯一の可能な解決策は、マザーボードの製造元からこの情報を提供する更新されたドライバーを入手することです(もちろん、ハードウェアにこの種の測定に必要なセンサーが含まれていると仮定します)。

編集: Open Hardware Monitorは、センサーにクエリを実行して、ハードウェアと直接対話するための独自のドライバーを作成したようです。この疑いは、サポートしている特定のハードウェアを文書化したWebページを熟読することで確認できます。

情報の取得にWMIを使用していないため、WMIから自分で情報を取得できることを証明するものではありません。

ただし、上記のリンク先のページの下部には、次の興味深いコメントが含まれています。

Open Hardware Monitorは、すべてのセンサーデータをWMI(Windows Management Instrumentation)に公開します。これにより、他のアプリケーションもセンサー情報を読み取って使用できるようになります。インターフェイスの予備的なドキュメントはここにあります。

そのため、Open Hardware Monitorの上に便乗し、そのドライバーを使用して情報を取得し、アプリ内でその情報を取得できるようです。ハードウェアメーカーがWMIにファン速度を提供する更新されたドライバーを提供することはないと思うので、これがおそらく最良の解決策です。

于 2013-03-12T12:45:46.143 に答える