Привет всем, мое приложение должно перевести компьютер в спящий режим и разбудить его через определенный период времени. Чтобы исследовать этот случай, я сделал простое консольное приложение, чтобы перевести компьютер в спящий режим и разбудить его через 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();
}
}
}
Control Panel
. - person Loathing   schedule 11.02.2016