2008-10-23 14 views
20

यह एक Windows घटना की सदस्यता के लिए है कि आग जब विंडोज में जाने या नींद से बाहर आ रहा या राज्य हाइबरनेट है संभव है?मुझे कैसे पता चलेगा कि विंडोज नींद या हाइबरनेट मोड में कब जा रहा है?

मैं जब कंप्यूटर कुछ सफाई करते हैं और समय के मुद्दों से बचने जब यह नींद से बाहर आता है करने के लिए सोने के लिए जा रहा है के बारे में पता किए जाने के लिए अपने आवेदन की जरूरत है।

उत्तर

19

Microsoft.Win32.SystemEvents.PowerModeChanged घटना आप इस जानकारी दे देंगे। यह घटना अब तक माइक्रोसॉफ्ट द्वारा जारी किए गए .NET ढांचे के सभी रूपों में उपलब्ध है।

3

आप Win32_PowerManagementEvent WMI घटना

+0

क्या आपके पास एक कोड उदाहरण है जो काम करता है, कृपया? (कुछ ऑनलाइन उदाहरणों की कोशिश की लेकिन वे घटना को आग लगने लगते नहीं हैं) –

6

निगरानी कर सकते हैं नेट में, PowerModeChanged घटना का उपयोग करें। Win32 में, WM_POWERBROADCAST संदेश का उपयोग करें।

3

यह सुनिश्चित नहीं है कि आप कितनी बार इसकी निगरानी करना चाहते हैं, लेकिन यदि आप .NET में कोई सेवा लिखते हैं तो आप सर्विसबेस को ओवरराइड कर सकते हैं, CanHandlePowerEvent को सत्य पर सेट कर सकते हैं, और फिर आपको PowerBroadcastStatus गणना के माध्यम से पावर परिवर्तनों की अधिसूचना दी जाएगी।

+0

'CanHandlePowerEvent' का उल्लेख करने के लिए धन्यवाद, यह मेरा मुद्दा था! – n0ne

3

एक दृश्य स्टूडियो 2005 सी ++ MFC आवेदन आप अपने संदेश नक्शा इस उदाहरण में WM_POWERBROADCAST संदेश की तलाश के लिए एक ON_MESSAGE() जोड़ने की आवश्यकता होगी में:

BEGIN_MESSAGE_MAP(CFrameworkWndDoc, CWindowDocument) 
    //{{AFX_MSG_MAP(CFrameworkWndDoc) 
    ON_WM_CHAR() 
    ON_WM_TIMER() 
    //}}AFX_MSG_MAP 
    ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd) 
END_MESSAGE_MAP() 

तो फिर तुम संदेश हैंडलर समारोह जोड़ने की आवश्यकता होगी वर्ग परिभाषा परिवर्तन के साथ ही इतनी है कि आप इस कंकाल के रूप में संदेश प्रकार के लिए wParam चर जांच कर सकते हैं संदेश हैंडलर के लिए सदस्य समारोह की घोषणा करने के:

// Handle the WM_POWERBROADCAST message to process a message concerning power management 
// such as going to Sleep or Waking Up. 
LRESULT CFrameworkWndDoc::OnPowerMsgRcvd(WPARAM wParam, LPARAM lParam) 
{ 
    switch (wParam) { 
     case PBT_APMPOWERSTATUSCHANGE: 
      TRACE0("PBT_APMPOWERSTATUSCHANGE received\n"); 
      break; 
     case PBT_APMRESUMEAUTOMATIC: 
      TRACE0("PBT_APMRESUMEAUTOMATIC received\n"); 
      break; 
     case PBT_APMRESUMESUSPEND: 
      TRACE0("PBT_APMRESUMESUSPEND received\n"); 
      break; 
     case PBT_APMSUSPEND: 
      TRACE0("PBT_APMSUSPEND received\n"); 
      break; 
    } 

    return 0; 
} 

मैं क्या है से एन कि एक आवेदन पत्र में ऊपर का उपयोग कर एक परीक्षण विंडोज 7 कि डीबगर में शुरू कर दिया है पर चल रहा है और उसके बाद मैं मैन्युअल रूप से नींद के लिए मैं निम्नलिखित संदेश देखेंगे अनुप्रयोग चल मेरे पीसी बनाने है:

PBT_APMSUSPEND received 

फिर जब पीसी दो संदेश एक के बाद एक पुनः आरंभ है और मैं साइन-इन मैं क्या डिबगर उत्पादन विंडो में देखेंगे रहे हैं:

PBT_APMRESUMESUSPEND received 
PBT_APMRESUMEAUTOMATIC received 

सब कुछ है कि मैं अब तक पाया है इंगित करता है कि आप कोई संकेत नहीं है कि क्या आप बाहर आ रहे हैं कि एक नींद की स्थिति या एक हाइबरनेट राज्य का। मैं अभी भी निलंबित होने पर या फ़ाइल और डिवाइस हैंडल के रूप में फिर से शुरू होने पर क्या करने की आवश्यकता है, इसके बारे में और अधिक शोध कर रहा हूं। मैंने संकेत देखा है कि COM बंदरगाहों को फ़ाइल हैंडल फिर से शुरू होने के बाद वैध नहीं हैं। उदाहरण के लिए डेटाबेस कनेक्शन के लिए मैं अन्य प्रक्रियाओं में इंटरफेस के बारे में भी अनिश्चित हूं।

मानक नींद और हाइबरनेट पावर प्रबंधन के अलावा, माइक्रोसॉफ्ट ने Connected Standby power state with Windows 8 and 8.1 पेश किया है जिसमें आवेदन के प्रकार के आधार पर कुछ एप्लिकेशन डिज़ाइन विध्वंस हैं।

डेस्कटॉप के प्रयोगों को विशिष्ट जुड़े अतिरिक्त के साथ एकीकृत करने का कोई अतिरिक्त कार्य की आवश्यकता है।

डेस्कटॉप गतिविधि मॉडरेटर (डीएएम) विंडोज घटक है जो सभी डेस्कटॉप अनुप्रयोगों को रोकता है और जुड़े हुए स्टैंडबाय के दौरान तृतीय-पक्ष सिस्टम सेवाओं के रनटाइम को थ्रॉटल करता है। का उद्देश्य डीएएम मौजूदा अनुप्रयोगों और सेवाओं के साथ मूल सॉफ्टवेयर संगतता बनाए रखना है, लेकिन नींद के दौरान बैटरी जीवन पर उनके प्रभाव को कम करें।

विंडोज़ डेस्कटॉप अनुप्रयोगों को डीएएम चरण पूर्ण होने के बाद जुड़े स्टैंडबाय के किसी भी हिस्से के दौरान चलने से रोकता है। विंडोज तीसरे पक्ष की सिस्टम सेवाओं को के बाद डीएएम चरण को पूरा करने के बाद थ्रॉटल मोड में निष्पादित करने की अनुमति देता है। इस मोड में, एक थर्ड-पार्टी सेवा चला सकती है, प्रत्येक 30 सेकंड में दीवार घड़ी के एक से अधिक सेकंड के लिए नहीं।

इंटेल से The Art of Graceful Application Suspension by Lynn Merrill लेकिन यह तिथि 2005 ऐसा नहीं सभी सामग्री Windows XP के बाद Windows से संबंधित हो सकता है Windows के तहत विद्युत प्रबंधन के साथ जुड़े विभिन्न विंडोज संदेश प्रकारों से निपटने के बारे में कुछ जानकारी है। Windows Vista PBT_APMQUERYSUSPEND संदेश से शुरू होने वाले संदेश दस्तावेज़ में वर्णित संदेश अनुक्रम में कम से कम एक अब उपयोग किया गया संदेश नहीं है जिसका उपयोग यह अनुरोध करने के लिए किया गया था कि कोई एप्लिकेशन निलंबित करने में सक्षम था या नहीं, अब विंडोज द्वारा उपयोग नहीं किया जाता है। SetThreadExecutionState() फ़ंक्शन अब यह इंगित करने के लिए उपयोग किया जाता है कि स्लीप या हाइबरनेट स्थिति में परिवर्तन के साथ थ्रेड को बाधित नहीं किया जा सकता है। पावर प्रबंधन राज्य संदेश परिवर्तनों के विवरण के लिए stackoverflow Can't catch sleep suspend messages (winxp) में उत्तरों देखें।

+0

+1 कनेक्ट किए गए स्टैंडबाय के बारे में नहीं पता था और मुझे आश्चर्य हुआ कि मेरी विंडोज़ सेवा ने टैबलेट पर गलत व्यवहार क्यों किया। आपका बहुत बहुत धन्यवाद! –

0

आप नेटवर्कChange.NetworkAvailableChanged और NetworkChange.NetworkAddressChanged की सदस्यता ले सकते हैं।

मैं आम तौर पर दो सेकंड टाइमर शुरू करता हूं ताकि जब मैं समय निकालता हूं तो नींद मोड में होने के बाद मैं नेटवर्क संचार को फिर से शुरू कर सकता हूं।

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