C# 獲取操作系統空閑時間


獲取系統鼠標和鍵盤沒有任何操作的空閑時間

復制代碼
     public class CheckComputerFreeState
{
/// <summary> /// 創建結構體用於返回捕獲時間 /// </summary> [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { /// <summary> /// 設置結構體塊容量 /// </summary> [MarshalAs(UnmanagedType.U4)] public int cbSize; /// <summary> /// 抓獲的時間 /// </summary> [MarshalAs(UnmanagedType.U4)] public uint dwTime; } [DllImport("user32.dll")] private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); /// <summary> /// 獲取鍵盤和鼠標沒有操作的時間 /// </summary> /// <returns>用戶上次使用系統到現在的時間間隔,單位為秒</returns> public static long GetLastInputTime() { LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO(); vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo); if (!GetLastInputInfo(ref vLastInputInfo)) { return 0; } else { var count = Environment.TickCount - (long)vLastInputInfo.dwTime; var icount = count / 1000; return icount; } } }
復制代碼

調用:

復制代碼
       static void Main(string[] args)
        {
            Timer t = null;
            t = new Timer((o) =>
           {
               var result = GetLastInputTime();
               Console.WriteLine(result);
               if (result < 1*60) return;
               if (t == null) return;
               t.Dispose();
               Console.WriteLine("電腦1分鍾未操作!");
           }, null, 1000, 1000);

            Console.ReadLine();
        }
復制代碼

 

 

出處:https://www.cnblogs.com/gaobing/p/4421400.html

========================================================================

重置空閑時間,可以在代碼中模擬鼠標或鍵盤操作

可參考我的博文:C# 模擬鼠標移動和點擊

========================================================================

在項目中出現的問題:

(1)問題一

在項目上線以后,調用GetLastInputTime出現負數的情況,剛開始也是考慮是否有數據類型不匹配而溢出的情況,由於沒有詳細Environment.TickCount  和  (long)vLastInputInfo.dwTime的記錄,且電腦重啟一次后可以正常。

也就是說,當計算數小於int.MaxValue的時候,計算都是正常的,超過這個數,則計算結果異常。

從網上尋求,看來大家也有遇到這個情況。參考如下連接,描述了Environment.TickCount的實現和出現負數的情況

https://social.microsoft.com/Forums/en-SG/b65614b5-9b44-4a87-bb9f-2c4ef0636a4d/gettickcount-environmenttickcount-?forum=2212

文章里說了:

Environment.TickCount,內部是用GetTickCount來實現的,該屬性的值從系統計時器派生,並以 32 位有符號整數的形式存儲。因此,如果系統連續運行,TickCount 將在約 24.9 天內從零遞增至 Int32. MaxValue ,然后跳至 Int32. MinValue (這是一個負數),再在接下來的 24.9 天內遞增至零。
DWORD是無符號的,計數范圍在49天左右,而 Environment.TickCount屬性返回的值是有符號的,所以有一半的值用負數表示!

解決方法:

參考鏈接:
http://www.it1352.com/30652.html

https://stackoverflow.com/questions/4645171/environment-tickcount-is-not-enough

文章中提到的解決方法,不外乎兩種:

1)Environment.TickCount & Int32.MaxValue 或直接使用 [DllImport("kernel32.dll") ] API 中的一個 GetTickCount() ,一個是int,一個是dword

2)public static extern UInt64 GetTickCount64();

使用計算的時候,首要保證參與計算的兩個數的類型必須一致,不一致通過上面的方法調整過來。

測試數據:

int a = -1716131578;

uint b = 2578835718;

注意:

我在使用Environment.TickCount & Int32.MaxValue的時候就出現了前后計算的數據類型不一致,導致結果錯誤,

Environment.TickCount & Int32.MaxValue - (long)vLastInputInfo.dwTime

運算結果是uint類型,為正數,未使用括號,先算減法,后算邏輯與。

(Environment.TickCount & Int32.MaxValue)- (long)vLastInputInfo.dwTime

運算結果是int類型,為負數,先與運算是正,后減法,無符號的

Int32.MaxValue的值,第一位是0,后面的31位是1

Int32.MaxValue的值,32位全是1

 

使用上面的數自己驗證


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM