Пробуждение от сна через определенное время С#

Привет всем, мое приложение должно перевести компьютер в спящий режим и разбудить его через определенный период времени. Чтобы исследовать этот случай, я сделал простое консольное приложение, чтобы перевести компьютер в спящий режим и разбудить его через 10 секунд.

после долгих исследований в Google и здесь, в стеке, я обнаружил, что обычно все ответы относятся к этому образцу: http://www.anotherchris.net/csharp/wake-up-from-sleep-createwaitabletimer-in-csharp/

1) Пробовал на одном пк (виндовс 7) и он заснул но не проснулся 2) сейчас пытаюсь заставить работать на другом пк (виндовс 10) но даже до конца функции не доходит. ..- вероятно остается ждать в : wh.waitОдна строка ...

итак, вот мой код - что я делаю неправильно?!? - буду признателен за любую помощь.... или предложения по другому способу сделать это...

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System.Threading;
using System.ComponentModel;
using System.Windows.Forms;
namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("kernel32.dll")]
        public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWaitableTimer(SafeWaitHandle hTimer, [In] ref long pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr lpArgToCompletionRoutine, bool fResume);

        static void Main(string[] args)
        {
            SetWaitForWakeUpTime();
            Application.SetSuspendState(PowerState.Suspend, false, false);

        }

        static void SetWaitForWakeUpTime()
        {
            DateTime utc = DateTime.Now.AddSeconds(5);
            long duetime = utc.ToFileTime();

            using (SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer"))
            {
                if (SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true))
                {
                    using (EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset))
                    {
                        wh.SafeWaitHandle = handle;
                        wh.WaitOne();
                    }
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }

            // You could make it a recursive call here, setting it to 1 hours time or similar
            Console.WriteLine("Wake up call");
            Console.ReadLine();
        }
    }
} 

person Kamornik Cola    schedule 03.11.2015    source источник
comment
Убедитесь, что таймеры пробуждения включены в текущих настройках плана питания в Control Panel.   -  person Loathing    schedule 11.02.2016


Ответы (3)


Я использовал управляемую оболочку Task Scheduler. Это было отличным решением моей проблемы:

Сделайте запланированную задачу для запуска через определенный период времени, она выводит компьютер из спящего режима. Я сделал небольшой сценарий выполнения «cmd.exe» с «выходом», чтобы ничего не планировать.

Я использовал: https://taskscheduler.codeplex.com/

person Kamornik Cola    schedule 05.11.2015
comment
Вместо этого вы можете использовать rundll32.exe без параметров. . - person Scott Chamberlain; 06.11.2015

В CodeProject есть проект, который дает пример этого: http://www.codeproject.com/Articles/49798/Wake-the-PC-from-standby-or-hibernation

Однако в других комментариях я видел, что не все материнские платы поддерживают функцию, используемую в этом приложении, поэтому она может работать на некоторых, но не на всех компьютерах.

person Jerren Saunders    schedule 03.11.2015
comment
я видел это - он делает точно такой же код... только начал из другого потока .... есть программа: passmark.com/products/sleeper.htm, который отлично работает на моем ПК - и делает именно это... - я пытаюсь сделать то же самое.... - person Kamornik Cola; 03.11.2015
comment
Мне любопытно, использует ли их программа программно планировщик заданий для планирования задачи, которая будит компьютер. stackoverflow.com/a/3764944 - person Jerren Saunders; 04.11.2015

Время выполнения должно быть отрицательным и выражаться в сотнях наносекунд. В следующем примере компьютер выйдет из спящего режима через 30 секунд.

long duetime = -300000000; 

msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ms686289(v=vs.85).aspx

person Michal    schedule 09.03.2016