سؤال

ما هي أفضل طريقة للتسبب برمج في نظام التشغيل Windows XP (أو أعلاه) للاستيقاظ في وقت محدد. (من الناحية المثالية مثل كيفية بدء تشغيل مركز الوسائط تلقائيا لتسجيل برنامج تلفزيون معين)

لدي خدمة Windows (مكتوبة في C #) وأود أن تتمكن هذه الخدمة من التسبب في بدء تشغيل الجهاز في الأوقات المحددة مسبقا.

هل هناك أي إعدادات BIOS أو المتطلبات الأساسية (على سبيل المثال ACPI) التي تحتاج إلى تكوينها لهذا العمل بشكل صحيح؟

ستكون هذه الآلة تستخدم المودم الهاتفي أو 3G اللاسلكي، لذلك لسوء الحظ، لا يمكن الاعتماد على Wake On Lan.

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

المحلول

يمكنك استخدام توقيت النوافذ للاستيقاظ من تعليق أو حالة السبات. من ما يمكنني أن أجده، فمن غير الممكن الاستيقاظ برمجيا من وضع الإغلاق العادي (Soft Off / S5)، في هذه الحالة، تحتاج إلى تحديد إنذار WakeonRTC في BIOS. لاستخدام أجهزة ضبط الوقت الناشئة من C #، تحتاج باتفوك. وبعد تصريحات الاستيراد هي:

public delegate void TimerCompleteDelegate();

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long pDueTime, int lPeriod, TimerCompleteDelegate pfnCompletionRoutine, IntPtr pArgToCompletionRoutine, bool fResume);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CancelWaitableTimer(IntPtr hTimer);

يمكنك استخدام هذه الوظائف بالطريقة التالية:

public static IntPtr SetWakeAt(DateTime dt)
{
    TimerCompleteDelegate timerComplete = null;

    // read the manual for SetWaitableTimer to understand how this number is interpreted.
    long interval = dt.ToFileTimeUtc(); 
    IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer");
    SetWaitableTimer(handle, ref interval, 0, timerComplete, IntPtr.Zero, true);
    return handle;
}

يمكنك بعد ذلك إلغاء المؤقت الناشئ مع CancelWaitableTimer, باستخدام المقبض الذي تم إرجاعه كوسيطة.

يمكن لبرنامجك السبات والنوم باستخدام Pinvoke:

[DllImport("powrprof.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetSuspendState(bool hibernate, bool forceCritical, bool disableWakeEvent);

public static bool Hibernate()
{
    return SetSuspendState(true, false, false);
}

public static bool Sleep()
{
    return SetSuspendState(false, false, false);
}

قد لا يسمح نظامك بالبرامج للسماح للكمبيوتر بإدخال الإسبات. يمكنك استدعاء الأسلوب التالي للسماح بالإسبابة:

public static bool EnableHibernate()
{
    Process p = new Process();
    p.StartInfo.FileName = "powercfg.exe";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.StartInfo.Arguments = "/hibernate on"; // this might be different in other locales
    return p.Start();
}

نصائح أخرى

يمكن تعيين برنامج جدولة المهام في WIN7، TAMAMSCHD.MSC (وأصدق XP أيضا) لإيقاظ النظام على مشغلات مختلفة. يمكن أن تكون هذه المشغلات الجدول الزمني والوقت والحدث، إلخ.

في Win7 على الأقل، تحتاج إلى تعيين "السماح لأوقات الاستيقاظ" ب "تمكين" لهذا العمل. تم العثور على هذا الإعداد تحت ...

-> لوحة التحكم أجهزة الصوت والصوت خيارات الطاقة
انقر - "تحرير إعدادات الخطة"
انقر - "تغيير إعداد الطاقة المتقدمة"
توسيع - "النوم"
توسيع - "السماح لأوقات الاستيقاظ"

أفضل رهان الخاص بك يستخدم استيقظوا على الشبكة المحلية الإمكانية. سيتطلب ذلك آلة أخرى لإرسال حزمة من نوع خاص لإيقاظ جهازك.

لن يكون هذا مفيدا إذا لم يكن جهازك متصلا بالشبكة أو لسبب ما لم ينقل هذا المنطق إلى جهاز آخر. ولكن من المفيد لبعض التكوينات حيث لديك آلات متعددة وتريد إيقاظها برمجيا.

تحتوي بعض الآلات على منبه BIOS التي يمكن تعيينها لاستيقاظ الكمبيوتر في ساعة معينة. يجب أن يكون من الممكن برمجة هذه الساعة، لكنني لا أعرف التفاصيل المحددة.

يحرر: لقد وجدت هذا برنامج يجب أن تتيح لك ضبط الوقت. إنه في ج، تحت لينكس، ولكن ربما يمكن أن تعطيك بعض التلميحات.

أ تحذير على الرغم من: قبل تجربة أي شيء يغير إعدادات BIOS مباشرة تأكد من الكتابة كل الإعداد من شاشات BIOS، لأنه في حالة وجود خطأ قد يعود BIOS إلى الإعداد الافتراضي للمصنع وقد تحتاج إلى إعداده مرة أخرى كما كان.

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