2013-04-06 12 views
16

Makinenin kullanılmadığı süreye göre Powershell veya toplu iş dosyası kullanarak dakika/saat olarak makinenin boşta kalma süresini elde etmenin bir yolu var mı?Makinenin boş kalmadığı anı alın

+0

"Daha önce kullanılmamış" tanımını yapın. Oturum açıldığından beri mi? Ekran koruyucu ne kadar sürdü? Tam olarak ne? –

+1

Bu sitede doğru bir şey yapamıyorum gibi görünüyor ... Olduğu gibi, aşağıdaki cevap tam olarak aradığım şeydi - kullanıcı, fareyi hareket ettirmeyi bıraktığı veya klavyedeki tuşlara basmayı bıraktığı noktadan boşta kalma süresiydi. – StrattonL

+1

Birinin size neden oy verdiğinden emin değilsiniz, belki de soru biraz belirsizdi ya da herhangi bir şey denediğinizi göstermiyorsa ... [Nasıl yapılacağını] kontrol ettiğinizden emin olun (http://stackoverflow.com/ sorular/nasıl yapılır) –

cevap

17

İşte Win32 API GetLastInputInfo kullanan bir PowerShell çözümdür.

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; 
      } 
     } 
    } 
} 
'@ 

Ve bir örnek kullanımı:

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

Çok teşekkürler! Tam olarak aradığım şey. Çıkışı nasıl daha okunabilir, yani 4 saat, 15 dakika, 21 saniye olacak şekilde nasıl biçimlendirebilirim? Tekrar teşekkürler! – StrattonL

+1

[Tarih formatlama] 'yı kullanın (http://technet.microsoft.com/en-us/library/ee692801.aspx) –

+1

Daha fazla yeteneğini göstermek için örneği güncelledim. –

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.") 

bu deneyin - bu nedenle farklı bir boşta zaman uzaktan çalışan rağmen farklı bir oturumda üzerinde çalışıyor olabilir ve?

İlgili konular