2013-04-06 34 views
16

Có cách nào để lấy thời gian không hoạt động của máy, như trong khoảng thời gian máy không được sử dụng, tính bằng phút/giờ bằng Powershell hoặc một tập tin batch?Lấy thời gian rảnh của máy

+0

Xác định "không được sử dụng cho" chính xác hơn. Kể từ khi nó được đăng xuất? Trình bảo vệ màn hình đã bật bao lâu? Những gì chính xác? –

+1

Tôi không thể làm bất cứ điều gì ngay trên trang này ... Khi điều đó xảy ra, câu trả lời dưới đây chính xác là những gì tôi đang tìm kiếm - thời gian rảnh từ điểm người dùng ngừng di chuyển chuột hoặc nhấn các nút trên bàn phím. – StrattonL

+1

Không chắc chắn lý do tại sao một người nào đó bỏ phiếu cho bạn, có lẽ câu hỏi hơi mơ hồ, hoặc không hiển thị nếu bạn đã thử bất cứ điều gì ... Hãy chắc chắn kiểm tra [cách hỏi] (http://stackoverflow.com/ câu hỏi/cách hỏi) –

Trả lời

17

Đây là giải pháp PowerShell sử dụng API Win32 GetLastInputInfo.

Add-Type @' 
using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace PInvoke.Win32 { 

    public static class UserInput { 

     [DllImport("user32.dll", SetLastError=false)] 
     private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

     [StructLayout(LayoutKind.Sequential)] 
     private struct LASTINPUTINFO { 
      public uint cbSize; 
      public int dwTime; 
     } 

     public static DateTime LastInput { 
      get { 
       DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); 
       DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); 
       return lastInput; 
      } 
     } 

     public static TimeSpan IdleTime { 
      get { 
       return DateTime.UtcNow.Subtract(LastInput); 
      } 
     } 

     public static int LastInputTicks { 
      get { 
       LASTINPUTINFO lii = new LASTINPUTINFO(); 
       lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); 
       GetLastInputInfo(ref lii); 
       return lii.dwTime; 
      } 
     } 
    } 
} 
'@ 

Và một cách sử dụng ví dụ:

for ($i = 0; $i -lt 10; $i++) { 
    Write-Host ("Last input " + [PInvoke.Win32.UserInput]::LastInput) 
    Write-Host ("Idle for " + [PInvoke.Win32.UserInput]::IdleTime) 
    Start-Sleep -Seconds (Get-Random -Minimum 1 -Maximum 5) 
} 
+0

Cảm ơn rất nhiều! Chính xác những gì tôi đang tìm kiếm. Làm thế nào tôi có thể định dạng đầu ra sao cho nó có thể đọc được - tức là 4 giờ, 15 phút, 21 giây? Cảm ơn một lần nữa! – StrattonL

+1

Sử dụng [định dạng ngày] (http://technet.microsoft.com/en-us/library/ee692801.aspx) –

+1

Tôi đã cập nhật ví dụ để thể hiện nhiều khả năng của nó hơn. –

0
$Last = [PInvoke.Win32.UserInput]::LastInput 
$Idle = [PInvoke.Win32.UserInput]::IdleTime 
$LastStr = $Last.ToLocalTime().ToString("MM/dd/yyyy hh:mm tt") 
Write-Host ("Last user keyboard/mouse input: " + $LastStr) 
Write-Host ("Idle for " + $Idle.Days + " days, " + $Idle.Hours + " hours, " + $Idle.Minutes + " minutes, " + $Idle.Seconds + " seconds.") 

Hãy thử điều này - mặc dù chạy xa nó có thể chạy trên một phiên khác nhau và do đó một thời gian nhàn rỗi khác nhau?

Các vấn đề liên quan