2008-10-15 17 views
9

विभिन्न प्रोग्राम केवल तभी काम कर सकते हैं जब आपने थोड़ी देर के लिए कंप्यूटर का उपयोग नहीं किया है (उदाहरण के लिए स्क्रीनसेवर, Google डेस्कटॉप इंडेक्सिंग इत्यादि)।विंडोज़ निष्क्रिय होने पर कैसे बताना है

वे कैसे निष्क्रिय होते हैं जब वे जानते हैं? क्या विंडोज़ में कुछ फ़ंक्शन है जो आपको बताता है कि यह कितना समय निष्क्रिय है, या क्या आपको गतिविधि को ट्रैक करने के लिए किसी प्रकार का कीबोर्ड/माउस हुक उपयोग करना है?

मैं सी # का उपयोग कर रहा हूं, लेकिन मुझे निष्क्रियता निर्धारित करने की किसी भी विधि में रूचि है।

उत्तर

10

संपादित करें: शर्न के उत्तर के पीछे पाठ और विवरण प्रदान करना, जो होना चाहिए और स्वीकार किया जाना चाहिए)। इसे मर्ज करने और हटाने के लिए स्वतंत्र महसूस करें।

GetLastInputInfo फ़ंक्शन GetLastInputInfo फ़ंक्शन अंतिम इनपुट ईवेंट का समय पुनर्प्राप्त करता है।

पी से यहाँ पेस्ट किया गया/आह्वान

यह समारोह पिछले उपयोगकर्ता इनपुट

[DllImport("user32.dll")] 
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

static int GetLastInputTime() 
{ 
    int idleTime = 0; 
    LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); 
    lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo); 
    lastInputInfo.dwTime = 0; 

    int envTicks = Environment.TickCount; 

    if(GetLastInputInfo(ref lastInputInfo)) 
    { 
    int lastInputTick = lastInputInfo.dwTime; 

    idleTime = envTicks - lastInputTick; 
    } 

    return ((idleTime > 0) ? (idleTime/1000) : idleTime); 
} 

[StructLayout(LayoutKind.Sequential)] 
struct LASTINPUTINFO 
{ 
    public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); 

    [MarshalAs(UnmanagedType.U4)] 
    public int cbSize;  
    [MarshalAs(UnmanagedType.U4)] 
    public UInt32 dwTime; 
} 

FWIW के बाद से समय को पुन: प्राप्त: मैं AnAppADay दौरान एक वैश्विक कीबोर्ड और माउस हुक लागू किया। इस ऐप को स्रोत के लिए देखें - यह आपके इच्छित चीज़ों के करीब है। जो वर्ग आप चाहते हैं वे AnAppaday में हैं। नामस्थान का उपयोग करता है। [लिंक्रोट के कारण खरोंच]

+0

ध्यान दें कि वापस दिया गया मान मान सेकेंड में एक मान है, जो तुरंत ऊपर स्पष्ट नहीं होता है। (व्यक्तिगत रूप से मैं फ़ंक्शन सेकेंड सिन्सलास्ट इनपुट या इसी तरह के कॉल को कॉल करता हूं) – Gareth

+0

मैंने ऐसा किया था, फिर इसे अपने सहकर्मी को रिमोट मशीन पर भेजने के लिए पेक्सैक का इस्तेमाल किया था। यह 2000 सेकंड से अधिक और बढ़ता दिखाता है। और मैं उसे अपने कंप्यूटर का उपयोग करके देखता हूं इसलिए यह भ्रामक है। ऐसा लगता है कि मशीन चालू होने के बाद से समय दिख रहा है। – fjleon

5

Google is your friend

मूल रूप से उपयोग करता this.
उपयोग करने से पहले प्रलेखन मत भूलना पूरी तरह से तैयार करने के लिए।

+0

मैं "निष्क्रिय" बनाम "निष्क्रिय" के लिए googling था। GetLastInputInfo बिल्कुल वही है जो मुझे चाहिए। धन्यवाद। –

+0

ध्यान रखें कि यह केवल वर्तमान सत्र के लिए है। ऐसे अन्य सत्र हो सकते हैं जहां उपयोगकर्ता सक्रिय हों। मुझे यकीन नहीं है कि यह क्रॉस-सत्र करना संभव है क्योंकि यह एक सुरक्षा उल्लंघन हो सकता है। – shoosh

+0

मुझे आश्चर्य है कि यह क्यों गिराया गया था? एकमात्र कारण यह है कि मैं सोच सकता हूं कि इसमें केवल लिंक हैं और कोई वास्तविक उत्तर नहीं है? या क्या यह है क्योंकि GetLastInputInfo का उपयोग करने में समस्याएं हैं? –

0

कीबोर्ड और माउस हुक जो मुझे सबसे मूल्यवान लगता है। नीचे दी गई कक्षा को सम्मिलित किया जा सकता है और आपको केवल यह पता लगाना होगा कि आप कुंजी और माउस अपडेट के बारे में जानकारी के साथ क्या करना चाहते हैं।

using System; 
using System.Runtime.InteropServices; 
using System.Threading; 
using System.Windows.Forms; 

namespace Example { 

    public class Hook { 

     delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); 

     [FlagsAttribute] 
      public enum WindowMessage { 
      WM_KEYDOWN =  0x0000000000000100, // &H100 
      WM_MOUSEMOVE =  0x0000000000000200, // &H200 
      WM_LBUTTONDOWN = 0x0000000000000201, // &H201 
      WM_RBUTTONDOWN = 0x0000000000000204, // &H204 
      WH_KEYBOARD = 2, 
      WH_MOUSE = 7, 
      HC_ACTION = 0 
     } 

     [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
     private static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); 

     [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
     private static extern bool UnhookWindowsHookEx(int idHook); 

     [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
     private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 

     //Declare MouseHookProcedure as a HookProc type. 
     static HookProc MouseHookProcedure; 
     static HookProc KeyboardHookProcedure; 

     private static int mhMouseHook = 0; 
     private static int mhKeyboardHook = 0; 

     public Hook() {} 

     public static void Init() { 
      MouseHookProcedure = new HookProc(MouseHookProc); 
      KeyboardHookProcedure = new HookProc(KeyboardHookProc); 
      mhMouseHook = SetWindowsHookEx((int)WindowMessage.WH_MOUSE, MouseHookProcedure, (IntPtr)0, AppDomain.GetCurrentThreadId()); 
      mhKeyboardHook = SetWindowsHookEx((int)WindowMessage.WH_KEYBOARD, KeyboardHookProcedure, (IntPtr)0, AppDomain.GetCurrentThreadId()); 
     } 

     public static void Terminate() { 
      UnhookWindowsHookEx(mhMouseHook); 
      UnhookWindowsHookEx(mhKeyboardHook); 
     } 

     private static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { 
      if (nCode >= 0) { 
       //do something here to update the last activity point, i.e. a keystroke was detected so reset our idle timer. 
      } 
      return CallNextHookEx(mhMouseHook, nCode, wParam, lParam); 
     } 

     private static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam) { 
      if (nCode >= 0) { 
       //do something here to update the last activity point, i.e. a mouse action was detected so reset our idle timer. 
      } 
      return CallNextHookEx(mhKeyboardHook, nCode, wParam, lParam); 
     } 

    } 
} 

बेशक यह केवल उस एप्लिकेशन के भीतर काम करता है जो आप हुकिंग कर रहे हैं। यदि आपको पूरे सिस्टम में निष्क्रियता को ट्रैक करने की आवश्यकता है, तो आपको एक डीएलएल बनाना होगा जिसे अन्य सभी विंडोज़ के पता रिक्त स्थान में लोड किया जा सके। दुर्भाग्यवश, मैंने किसी भी हैक के बारे में नहीं सुना है जो एक .net संकलित। डीएल की अनुमति देगा जो इस परिदृश्य में काम करेगा; हमारे पास एक सी ++ डीएलएल है जो इस उद्देश्य के लिए हुक करता है।

+0

क्या आप GetLastInputInfo के बारे में जानते थे? क्या ऐसा कोई कारण है जो आप इसे GetLastInputInfo के बजाय करते थे? –

+0

यह अधिक जटिल है ;-) पीपीएल की तरह :) – Skuta

+0

दरअसल, नहीं, मुझे GetLastInputInfo से अवगत नहीं था। लेकिन यह देखते हुए कि आमतौर पर जब हम इस तरह के हुक करते हैं, हम केवल टाइमआउट जानकारी की तलाश नहीं कर रहे हैं, जो अकेले कॉल हमारे लिए उपयोगी नहीं होगा। हम आमतौर पर कुंजी और माउस हैंडलिंग कार्यक्षमता की एक विस्तृत श्रृंखला के लिए hooking कर रहे हैं। – Bill

संबंधित मुद्दे