5

システムが最後に起動されたのはいつかを知りたいです。

Environment.TickCount は機能しますが、int の制限により 48 ~ 49 日後に機能しなくなります。

これは私が使用しているコードです:

Environment.TickCount & Int32.MaxValue

long 型の return について何か知っている人はいますか?

これを使用して、システムのアイドル時間を把握しています。

public static int GetIdleTime()
{
    return (Environment.TickCount & Int32.MaxValue)- (int)GetLastInputTime();
}

/// <summary>
/// Get the last input time from the input devices.
/// Exception: 
/// If it cannot get the last input information then it throws an exception with 
/// the appropriate message.
/// </summary>
/// <returns>Last input time in milliseconds.</returns>
public static uint GetLastInputTime()
{
    LastInputInfo lastInPut = new LastInputInfo();
    lastInPut.BlockSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
    if (!GetLastInputInfo(ref lastInPut))
    {
        throw new Exception(GetLastError().ToString());
    }

    return lastInPut.Time;
}
4

6 に答える 6

8
public void BootTime(){    
    SelectQuery query = new SelectQuery("SELECT LastBootUpTime FROM Win32_OperatingSystem WHERE Primary='true'");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

    foreach (ManagementObject mo in searcher.Get())
    {
        DateTime dtBootTime = ManagementDateTimeConverter.ToDateTime(mo.Properties["LastBootUpTime"].Value.ToString());
        Console.WriteLine(dtBootTime.ToString());
    }
}
于 2011-01-10T09:19:09.393 に答える
6

Environment.TickCount戻り値は 32 ビット整数であるため、約 25 日後にオーバーフローすることは間違いありません。

TickCountただし、システムが最後にいつ起動されたかを判断したい場合は、比較を試みるよりも良い方法があります。あなたが探しているものは、システム稼働時間と呼ばれます。これを取得するには、いくつかの方法があります。

最も簡単な方法は、(名前空間で)PerformanceCounterクラスを使用することです。これにより、特定のシステム パフォーマンス カウンターを照会できます。System.Diagnostics次のコードを試してください。

TimeSpan upTime;
using (var pc = new PerformanceCounter("System", "System Up Time"))
{
    pc.NextValue();    //The first call returns 0, so call this twice
    upTime = TimeSpan.FromSeconds(pc.NextValue());
}
Console.WriteLine(upTime.ToString());

または、 WMIを使用してこれを行うこともできます。しかし、stian.netの答えはそれをカバーしているようです。

最後に、国際バージョンの Windows をサポートする必要がある場合は、パフォーマンス カウンターの名前をローカライズする必要があることに注意してください。したがって、正しい解決策では、 PdhLookupPerfNameByIndexを使用して「システム」および「システム アップ タイム」のローカライズされた文字列を検索するか、内部でPdhAddEnglishCounterを使用していますが、これは Vista 以降でのみサポートされています。詳細については、こちらをご覧ください。

于 2011-01-10T09:24:56.223 に答える