C#: Как разбудить систему, которая была выключена?
Есть ли Win32 API для пробуждения системы, которая была закрыта в определенное время? Я видел программу с именем Autopower On, которая может включать систему в указанное время.
4 ответа
Получил ниже пост с сайта. Кто-нибудь пробовал это?
Ничего в рамках, поэтому вам придется немного "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");
}
}
}
Этот пост проекта Wake on LAN (WOL) может быть полезен (и материнская плата, и NIC должны поддерживать WOL)
После того, как вы фактически выключили свой компьютер (не спящий и не находящийся в спящем режиме), вы не сможете разбудить его непосредственно из кода C#, C++. Ведь сама ОС закрыта.
Единственным шансом для вашей материнской платы будет поддержка какого-либо механизма таймера. И с некоторой функцией C++, чтобы иметь возможность записать некоторые флаги в BIOS и установить этот таймер.
Используйте меню "Запланированная задача" окна. Увидеть:
http://www.howtogeek.com/119028/how-to-make-your-pc-wake-from-sleep-automatically/
Вы создаете программу, которую хотите запускать после пробуждения, а затем вручную вводите ее в список запланированных задач Windows, чтобы впервые пробудиться через определенное время.
Когда вы программируете пробуждения, я не уверен, что вам нужно, чтобы ваша программа вызывала Windows API, чтобы остановить ее повторное пробуждение, также, если вы хотите, чтобы ваша программа выключала компьютер после запуска другой запланированной задачи, чтобы снова ее разбудить. Необходимо пересмотреть, какие API-интерфейсы для Windows существуют для этого.