2009-06-24 10 views
54

Onların boşta olmadıklarını belirlemek amacıyla bir kullanıcının kendi makine ile etkileşimde son kez algılamak için gereken küçük bir tepsi uygulama yazıyorum geçen kullanıcı etkileşiminin zaman algıla.C# - OS

Kullanıcı son faresini hareket zamanı almak için herhangi bir yolu var mı, bir tuşa basın veya bunların makine ile herhangi bir şekilde etkileşime? Ben Windows'u anlamaya

açıkçası vb Bir ekran koruyucu veya güç aşağı, ne zaman göstereceğini Bunu belirlemek için izler, o yüzden kendimi bu düzeltilmesine yönelik bir Windows API var varsayıyorum?

cevap

60

GetLastInputInfo. PInvoke.net belgesinde belgelenmiştir.

+2

Mükemmel, teşekkür ederim. PInvoke.net için – GenericTypeTea

+4

1 - Şimdiye kadar bu kaynak hakkında bilmiyordum. –

+0

fare ve klavye etkinliği olmadan dokunmatik ekranlar için çalışmıyor – Smith

29

Eğer

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks); 

Not kullanabilirsiniz

internal struct LASTINPUTINFO 
{ 
    public uint cbSize; 

    public uint dwTime; 
} 

/// <summary> 
/// Helps to find the idle time, (in milliseconds) spent since the last user input 
/// </summary> 
public class IdleTimeFinder 
{ 
    [DllImport("User32.dll")] 
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);   

    [DllImport("Kernel32.dll")] 
    private static extern uint GetLastError(); 

    public static uint GetIdleTime() 
    { 
     LASTINPUTINFO lastInPut = new LASTINPUTINFO(); 
     lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut); 
     GetLastInputInfo(ref lastInPut); 

     return ((uint)Environment.TickCount - lastInPut.dwTime); 
    } 
/// <summary> 
/// Get the Last input time in milliseconds 
/// </summary> 
/// <returns></returns> 
    public static long GetLastInputTime() 
    { 
     LASTINPUTINFO lastInPut = new LASTINPUTINFO(); 
     lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut); 
     if (!GetLastInputInfo(ref lastInPut)) 
     { 
      throw new Exception(GetLastError().ToString()); 
     }  
     return lastInPut.dwTime; 
    } 
} 

zaman içine TickCount dönüştürmek için aşağıdaki şu ad alanları
using System; 
using System.Runtime.InteropServices; 

ve ardından dahil bulunmaktadır. Bu rutin terimi TickCount kullanır ancak değerler Keneler aynı milisaniye cinsinden ve böylece değildir. MSDN article on Environment.TickCount

itibaren

sistem başladı yana geçen milisaniye sayısını alır.

+15

Sen milisaniye cinsinden boşta zaman olsun, keneler değil. – kennyzx

+0

kennyzx zaman çizelgesi almak için doğru yolu belirtildiği gibi 'TimeSpan timespent = TimeSpan.FromMilliseconds (ticks);' – Petr

+0

Bir sınıf oluşturduğumda, herhangi bir nesneyi bir değere ayarlamak için sınıftan alamıyorum. Sınıfı hazırladıktan sonra nasıl kullanırsın? – Jay

1

Kodu:

using System; 
using System.Runtime.InteropServices; 

public static int IdleTime() //In seconds 
    { 
     LASTINPUTINFO lastinputinfo = new LASTINPUTINFO(); 
     lastinputinfo.cbSize = Marshal.SizeOf(lastinputinfo); 
     GetLastInputInfo(ref lastinputinfo); 
     return (((Environment.TickCount & int.MaxValue) - (lastinputinfo.dwTime & int.MaxValue)) & int.MaxValue)/1000; 
    }