Система пробуждения из режима сна C#

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

Я много гуглил об этом, и примеры в Интернете, похоже, не работают.

Я использовал WaitableTimer, чтобы перевести систему в спящий режим, но, похоже, она не просыпается.

Может кто-нибудь помочь мне здесь.

для справки по коду я использую WPF

Спасибо


person Sandeep Bansal    schedule 01.10.2010    source источник
comment
Что вы подразумеваете под «системой» — операционную систему, то есть Windows, или ваше приложение? Что на самом деле вы подразумеваете под состоянием «сна» и событием «пробуждения»? Я думаю, что есть больше способов понять ваш вопрос.   -  person Ondrej Tucny    schedule 01.10.2010
comment
Когда я имею в виду систему, я имею в виду машину, состояние сна означает, что вы можете перевести систему в спящий режим, поскольку существуют состояния сна и гибернации, и я хочу вывести ее из спящего режима из своего приложения. Я читал, что WaitableTimer на самом деле все еще работает, когда системы спят, но не может заставить его работать.   -  person Sandeep Bansal    schedule 01.10.2010
comment
Вы не задаете этот вопрос разумным способом. Обязательно что-то не так с вашим вызовом SetWaitableTimer или объявлением pinvoke. Или ваша ошибка проверки вызова. Почтовый индекс.   -  person Hans Passant    schedule 01.10.2010


Ответы (2)


Может ли какое-либо другое программное обеспечение разбудить ваш компьютер по расписанию? Вам нужно выяснить, связана ли проблема с вашим кодом или с конфигурацией вашей системы, и запуск чужого программного обеспечения в качестве теста — самый простой способ.

Возможно, вам потребуется включить поддержку «пробуждения по таймеру» в BIOS.

Какую версию Windows вы используете? Windows Vista и 7 поставляются с некоторыми инструментами для включения/отключения возможности отдельных компонентов пробуждать систему, чтобы, например. решить проблемы, когда очень чувствительная мышь непреднамеренно двигается достаточно, чтобы разбудить компьютер. Возможно, вам потребуется включить поддержку пробуждения для компонентов HPET или RTC.

person Ben Voigt    schedule 01.10.2010
comment
Привет, я использую Windows 7 x64 Ultimate, и я включил использование таймеров пробуждения в настройках параметров питания, но ничего не происходит, я смог найти только один другой таймер пробуждения, но он, похоже, не с открытым исходным кодом. - person Sandeep Bansal; 01.10.2010
comment
Итак, вы следовали приведенным здесь инструкциям: support.microsoft.com/kb/973454? Встроенное расписание задач может разбудить компьютер, попробуйте это (инструкции для Vista, но также будут работать на 7): winvistaclub.com/t86.html - person Ben Voigt; 01.10.2010

Пробовали ли вы пробуждение по локальной сети (с использованием MAC-адреса):

namespace WakeOnLan
{
    class Program
    {
        static void Main(string[] args)
        {
            if(args.Length==1)
            {
                string bytes = args[0].Replace("-", "");
                long l = 0;
                if (bytes.Length != 12 || !long.TryParse(bytes.Substring(0, 6), NumberStyles.HexNumber, null, out l) || !long.TryParse(bytes.Substring(6), NumberStyles.HexNumber, null, out l))
                    Console.WriteLine("Invalid string");
                else
                {
                    try
                    {
                        WakeOnLan(bytes);
                        Console.WriteLine("Sent wake on lan");
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
            }
            else
            {
                Console.WriteLine("WakeOnLan.exe <MAC Address>\r\nMAC address must be 6 bytes in hexadecimal format, optionally separated by hyphen.");
            }
        }

        private static void WakeOnLan(string bytesString)
        {
            List<byte> packet = new List<byte>();
            for (int i = 0; i < 6; i++)
            {
                packet.Add(byte.Parse(bytesString.Substring(i*2,2),NumberStyles.HexNumber));
            }

            byte[] mac = packet.ToArray();
            for (int i = 0; i < 15; i++)
            {
                packet.AddRange(mac);
            }
            for (int i = 0; i < 6; i++)
            {
                packet.Insert(0, 0xFF);
            }

            UdpClient client = new UdpClient();
            client.Connect(IPAddress.Broadcast, 7); //Any UDP port will work, but 7 is my lucky number ... 
            client.Send(packet.ToArray(), packet.Count); 
        }

    }
}
person Aliostad    schedule 01.10.2010
comment
На самом деле я пытался держаться подальше от пробуждения по локальной сети, так как большинство моих пользователей будут использовать беспроводной адаптер, а это явно не поддерживается. - person Sandeep Bansal; 01.10.2010