C #: Как разбудить систему, которая была выключена? - PullRequest
9 голосов
/ 31 октября 2010

Существует ли какой-либо Win32 API для пробуждения системы, которая была закрыта в определенное время? Я видел программу с именем Autopower On, которая может включать систему в указанное время.

Ответы [ 4 ]

11 голосов
/ 31 октября 2010

Получил нижеприведенный пост с сайта. Кто-нибудь пробовал это?

Ничего в рамках, поэтому вам придется немного "PInvoke". API, которые вам нужно вызвать, это CreateWaitableTimer и SetWaitableTimer. Ниже приводится полный (Q & D) пример, который иллюстрирует, как вы можете установить система, которая должна быть выведена из режима сна / гибернации с использованием Win32 API выше. Обратите внимание, что здесь я устанавливаю относительное время пробуждения 300000000 нСек. Это означает, что компьютер проснется (если он спит или в спящем режиме) в течение 30 секунд после установки таймера. Обратитесь к документации MSDN для получения подробной информации о SetWaitableTimer и его аргументах.

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Willys
{
    class Program
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes,
        bool bManualReset, string lpTimerName);

        [DllImport("kernel32.dll")]
        public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long
        pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr
        lpArgToCompletionRoutine, bool fResume);

        [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
        public static extern Int32 WaitForSingleObject(IntPtr handle, uint
        milliseconds);

        static void Main()
        {
            SetWaitForWakeUpTime();
        }

        static IntPtr handle;
        static void SetWaitForWakeUpTime()
        {
            long duetime = -300000000; // negative value, so a RELATIVE due time
            Console.WriteLine("{0:x}", duetime);
            handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer");
            SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true);
            uint INFINITE = 0xFFFFFFFF;
            int ret = WaitForSingleObject(handle, INFINITE);
            MessageBox.Show("Wake up call");
        }
    }
}
2 голосов
/ 01 ноября 2010

После того, как вы фактически выключили свой компьютер (не спящий и не спящий), вы не сможете разбудить его непосредственно из кода C #, C ++. Ведь сама ОС закрыта.

Единственным шансом для вашей материнской платы будет поддержка какого-либо механизма таймера. И с некоторой функцией C ++, чтобы иметь возможность записать некоторые флаги в BIOS и установить этот таймер.

2 голосов
/ 31 октября 2010

Этот Wake on LAN (WOL) код проекта сообщения может быть полезным (и материнская плата и сетевая карта должны поддерживать WOL)

0 голосов
/ 23 ноября 2014

Использование окна «Запланированная задача» меню. См:

http://www.howtogeek.com/119028/how-to-make-your-pc-wake-from-sleep-automatically/

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

Когда вы просыпаетесь, я не уверен, нужна ли вам ваша программа для вызова Windows API прекратите его повторное пробуждение, то же самое, если вы хотите, чтобы ваша программа выключала компьютер после запуска другого запланированного задания, чтобы снова его разбудить. Для этого нужно пересмотреть, какие API-интерфейсы для Windows существуют.

...