2008-10-29 16 views

उत्तर

8

यदि आप चाहते हैं कि आपका प्रोग्राम चलने के दौरान सोया न जाए, तो सबसे अच्छा तरीका है KeepAlive प्रकार फ़ंक्शन बनाना जो SystemIdleTimerReset, SHIdleTimerReset को कॉल करता है और एक महत्वपूर्ण स्पर्श सिम्युलेट करता है। फिर आपको इसे मूल रूप से हर जगह कॉल करने की आवश्यकता है।

#include <windows.h> 
#include <commctrl.h> 

extern "C" 
{ 
    void WINAPI SHIdleTimerReset(); 
}; 

void KeepAlive() 
{ 
    static DWORD LastCallTime = 0; 
    DWORD TickCount = GetTickCount(); 
    if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound 
    { 
     SystemIdleTimerReset(); 
     SHIdleTimerReset(); 
     keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0); 
     keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0); 
     LastCallTime = TickCount; 
    } 
} 

यह विधि केवल तब काम करती है जब उपयोगकर्ता मैन्युअल रूप से एप्लिकेशन प्रारंभ करता है।

यदि आपका आवेदन अधिसूचना द्वारा शुरू किया गया है (यानी डिवाइस को निलंबित कर दिया गया है), तो आपको अधिक करने की आवश्यकता है या नहीं तो आपका आवेदन बहुत ही कम समय के बाद निलंबित कर दिया जाएगा जब तक उपयोगकर्ता डिवाइस को निलंबित करने से रोकता है मोड। इसे संभालने के लिए आपको डिवाइस को अप्रयुक्त पावर मोड में रखना होगा।

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE)) 
{ 
    // handle error 
} 

// do long running process 

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE)) 
{ 
    // handle error 
} 

पहुंच से बाहर मोड उपयोग के दौरान, आप अभी भी, KeepAlive एक बहुत कॉल करने की आवश्यकता आप एक अलग थ्रेड कि एक्स मिलीसेकंड के लिए सोता है और जीवित funcation रखने कॉल उपयोग कर सकते हैं।

कृपया ध्यान दें कि अनुपयुक्त मोड इसे नींद मोड से बाहर नहीं लाता है, यह डिवाइस को अजीब आधे जागने वाले राज्य में रखता है।

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

1

शायद (लेकिन सी # में)

कि लेख में यह भी सोने के लिए मोबाइल डिवाइस को रोकने के लिए (जो वास्तव में आप क्या चाहते हो सकता है नहीं है) एक तरह से वर्णन करता है described here के रूप में "सिस्टम पावर स्टेट्स" संशोधित करके, फोन करके मूल कार्य SystemIdleTimerReset() समय-समय पर (डिवाइस को कम करने से रोकने के लिए)।

6

संशोधित the Power Manager registry setting कि विशिष्ट नींद हालत आप चाहते हैं (समय समाप्ति, बल्लेबाज, एसी बिजली, आदि) और "PowerManager/ReloadActivityTimeouts" कहा जाता है सेटिंग्स को फिर से लोड करने के लिए ओएस बताने के लिए एक नामित प्रणाली घटना पर SetEvent प्रभावित करता है।

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