منع النوافذ من الذهاب إلى النوم عند تشغيل البرنامج؟

StackOverflow https://stackoverflow.com/questions/629240

  •  08-07-2019
  •  | 
  •  

سؤال

ولقد وقف النوافذ من الذهاب إلى النوم عند تشغيل برنامجي.

وأنا لا أريد فقط لمنع النوم الموقت، وأريد أيضا لإلغاء النوم الحدث إذا كنت اضغط على زر النوم أو بأي طريقة أخرى أقول بنشاط الكمبيوتر في حالة السكون. لذلك SetThreadExecutionState لا يكفي.

وأو ... ليس لدي في الواقع لمنع النوم تماما، وتأخير فقط أنها 5-10sec للسماح برنامجي لإنهاء المهمة.

(وأنا أعلم أن هذا هو سلوك برنامج سيئة ولكن هو فقط للاستخدام الشخصي).

هل كانت مفيدة؟

المحلول

وكان لي مشكلة من هذا القبيل مع أحد الأجهزة المتصلة عبر USB. سيكون XP / فيستا النوم / السبات الحق في وسط ... عظيم أقول لكم، عندما تستأنف يمكن أن تستمر فقط. إذا كان لا يزال على اتصال الأجهزة !!! المستخدمين الذين لديهم هذه العادة من سحب كابلات خارج كلما يشعرون بالرغبة في ذلك.

وتحتاج إلى التعامل مع XP وفيستا

وتحت فخ XP على WM_POWERBROADCAST والبحث عن wparam PBT_APMQUERYSUSPEND.

   // See if bit 1 is set, this means that you can send a deny while we are busy
   if (message.LParam & 0x1)
   {
      // send the deny message
      return BROADCAST_QUERY_DENY;
   } // if
   else
   {
      return TRUE;
   } // else

وتحت فيستا استخدام SetThreadExecutionState مثل هذا

// try this for vista, it will fail on XP
if (SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED) == NULL)
{
   // try XP variant as well just to make sure 
   SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
}  // if 

وعند التطبيق والانتهاء من وضع إعادته إلى وضعها الطبيعي

// set state back to normal
SetThreadExecutionState(ES_CONTINUOUS);

نصائح أخرى

وبعد الإجابة النظر همة و

<اقتباس فقرة>   

و"استخدام PowerCreateRequest، PowerSetRequest، وPowerClearRequest   وظائف هي الأسلوب المفضل ".

ومع AvailabilityRequests.docx مرتبط على MSDN الذي يرهق للوصول الى ذلك (كثيرا لقراءة)، لقد بحثت في الإنترنت عن مثال ملموس في <فئة = "ما بعد سمة" أ href = "/ الأسئلة / المعلمة / ج 23٪" عنوان = "المعرض الأسئلة الموسومة "ج #" يختلط = "العلامة"> ج # يستند على PowerCreateRequest وجدت <لأ href = "http://go4answers.webhost4life.com/Example/problem-monitor-wakeup-service- windows7-12092.aspx "يختلط =" نوفولو noreferrer "> http://go4answers.webhost4life.com/Example/problem-monitor-wakeup-service-windows7-12092.aspx [تحرير 2016 - غير متوفر بعد الآن]

ونسخها وتكييفه لاحتياجات بلدي (PInvoke من CloseHandle نسخ من <لأ href = "http://msdn.microsoft.com/en-us/library/windows/desktop/ms724211٪28v=vs.85٪29 .aspx اتصال "يختلط =" نوفولو noreferrer "> MSDN ):

using System.Runtime.InteropServices;

    #region prevent screensaver, display dimming and automatically sleeping
    POWER_REQUEST_CONTEXT _PowerRequestContext;
    IntPtr _PowerRequest; //HANDLE

    // Availability Request Functions
    [DllImport("kernel32.dll")]
    static extern IntPtr PowerCreateRequest(ref POWER_REQUEST_CONTEXT Context);

    [DllImport("kernel32.dll")]
    static extern bool PowerSetRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType);

    [DllImport("kernel32.dll")]
    static extern bool PowerClearRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    internal static extern int CloseHandle(IntPtr hObject);

    // Availablity Request Enumerations and Constants
    enum PowerRequestType
    {
        PowerRequestDisplayRequired = 0,
        PowerRequestSystemRequired,
        PowerRequestAwayModeRequired,
        PowerRequestMaximum
    }

    const int POWER_REQUEST_CONTEXT_VERSION = 0;
    const int POWER_REQUEST_CONTEXT_SIMPLE_STRING = 0x1;
    const int POWER_REQUEST_CONTEXT_DETAILED_STRING = 0x2;

    // Availablity Request Structures
    // Note:  Windows defines the POWER_REQUEST_CONTEXT structure with an
    // internal union of SimpleReasonString and Detailed information.
    // To avoid runtime interop issues, this version of 
    // POWER_REQUEST_CONTEXT only supports SimpleReasonString.  
    // To use the detailed information,
    // define the PowerCreateRequest function with the first 
    // parameter of type POWER_REQUEST_CONTEXT_DETAILED.
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct POWER_REQUEST_CONTEXT
    {
        public UInt32 Version;
        public UInt32 Flags;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string
            SimpleReasonString;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct PowerRequestContextDetailedInformation
    {
        public IntPtr LocalizedReasonModule;
        public UInt32 LocalizedReasonId;
        public UInt32 ReasonStringCount;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string[] ReasonStrings;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct POWER_REQUEST_CONTEXT_DETAILED
    {
        public UInt32 Version;
        public UInt32 Flags;
        public PowerRequestContextDetailedInformation DetailedInformation;
    }
    #endregion



    /// <summary>
    /// Prevent screensaver, display dimming and power saving. This function wraps PInvokes on Win32 API. 
    /// </summary>
    /// <param name="enableConstantDisplayAndPower">True to get a constant display and power - False to clear the settings</param>
    private void EnableConstantDisplayAndPower(bool enableConstantDisplayAndPower)
    {
        if (enableConstantDisplayAndPower)
        {
            // Set up the diagnostic string
            _PowerRequestContext.Version = POWER_REQUEST_CONTEXT_VERSION;
            _PowerRequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING;
            _PowerRequestContext.SimpleReasonString = "Continuous measurement"; // your reason for changing the power settings;

            // Create the request, get a handle
            _PowerRequest = PowerCreateRequest(ref _PowerRequestContext);

            // Set the request
            PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired);
            PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired);
        }
        else
        {
            // Clear the request
            PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired);
            PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired);

            CloseHandle(_PowerRequest);
        }
    }

وظائف عن طريق PowerCreateRequest، PowerSetRequest، وPowerClearRequest هو الأسلوب المفضل. التفاصيل والتعليمات البرمجية (C / C #) هي داخل http://msdn.microsoft.com /en-us/library/windows/hardware/gg463205.aspx

وماذا عن الاستيقاظ إعادته إذا كان يذهب إلى النوم؟

http://www.enterprisenetworksandservers.com/monthly/art.php؟1049

ونفس الأسلوب ينطبق بالنسبة لمنع شاشة ينبغي استخدامها. انظر منع برمجيا ويندوز شاشة التوقف من بدء .

لاحظ أن بعض إعدادات الأمان يمكن تجاوز هذا (مما اضطر أجهزة الكمبيوتر لقفل بعد وقت معين واحد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top