2009-06-24 11 views
54

के साथ अंतिम उपयोगकर्ता इंटरैक्शन का समय पता करें मैं एक छोटा ट्रे एप्लिकेशन लिख रहा हूं जिसे पिछली बार उपयोगकर्ता ने मशीन के साथ बातचीत करने की आवश्यकता है, यह निर्धारित करने के लिए कि वे निष्क्रिय हैं या नहीं।सी # - ओएस

क्या कोई उपयोगकर्ता पिछली बार अपना माउस ले जाने, किसी कुंजी को हिट करने या अपनी मशीन के साथ किसी भी तरह से बातचीत करने का कोई तरीका है?

मुझे लगता है कि विंडोज़ स्क्रीन स्क्रीन सेवर या पावर डाउन आदि को प्रदर्शित करने के लिए यह स्पष्ट रूप से ट्रैक करता है, इसलिए मुझे लगता है कि यह स्वयं को पुनर्प्राप्त करने के लिए एक विंडोज एपीआई है?

उत्तर

60

GetLastInputInfoPInvoke.net पर प्रलेखित।

+2

बिल्कुल सही, धन्यवाद। P12voke.net के लिए – GenericTypeTea

+4

+1 - मुझे अब तक उस संसाधन के बारे में पता नहीं था। –

+0

माउस और कीबोर्ड गतिविधि के बिना टच स्क्रीन के लिए काम नहीं करता – Smith

29

आप उपयोग कर सकते

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks); 

नोट निम्नलिखित

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

समय में tickcount परिवर्तित करने के लिए निम्नलिखित नामस्थान

using System; 
using System.Runtime.InteropServices; 

और फिर शामिल हैं। यह दिनचर्या टिक टिकउंट शब्द का उपयोग करती है लेकिन मान मिलीसेकंड में हैं और इसलिए टिक्स के समान नहीं हैं।

से MSDN article on Environment.TickCount

तब से बीत चुका प्रणाली शुरू कर दिया मिलीसेकेंड की संख्या हो जाता है।

+15

आपको मिलीसेकंड में निष्क्रिय समय मिलता है, न कि टिक। – kennyzx

+0

केनेज़ेक्स के रूप में टाइमपैन प्राप्त करने के लिए सही तरीका का उल्लेख 'टाइमस्पेन टाइमपैंट = टाइमस्पेन। फ्रॉममिलिसकंड्स (टिक); ' – Petr

+0

जब मैं कक्षा बनाता हूं तो मुझे किसी वर्ग को किसी मूल्य पर सेट करने के लिए कक्षा से बाहर नहीं मिल सकता है, क्या आप इसका एक उदाहरण पोस्ट कर सकते हैं कक्षा को तुरंत चालू करने के बाद आप इसका उपयोग कैसे करेंगे? – Jay

1

कोड:

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