2012-05-23 205 views
1

我试图完成这项工作的最后一天:使用WPF应用程序将我的计算机从睡眠或休眠状态唤醒。没有我试过的工作。WPF应用程序:唤醒计算机从睡眠或休眠状态

到目前为止,我已经试过最流行的例子在网络上。例如:

[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); 


     public static void SetWaitForWakeUpTime() 
     { 
      DateTime utc = DateTime.Now.AddMinutes(2); 
      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(); 
     } 

和使用:

WakeUp.SetWaitForWakeUpTime(); 

我也试过了这个例子(见如何我使用的代码之后的方法):

public event EventHandler Woken; 

private BackgroundWorker bgWorker = new BackgroundWorker(); 

public WakeUp() 
{ 
    bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
    bgWorker.RunWorkerCompleted += 
     new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); 
} 

public void SetWakeUpTime(DateTime time) 
{ 
    bgWorker.RunWorkerAsync(time.ToFileTime()); 
} 

void bgWorker_RunWorkerCompleted(object sender, 
       RunWorkerCompletedEventArgs e) 
{ 
    if (Woken != null) 
    { 
     Woken(this, new EventArgs()); 
    } 
} 

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    long waketime = (long)e.Argument; 

    using (SafeWaitHandle handle = 
       CreateWaitableTimer(IntPtr.Zero, true, 
       this.GetType().Assembly.GetName().Name.ToString() + "Timer")) 
    { 
     if (SetWaitableTimer(handle, ref waketime, 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()); 
     } 
    } 
} 

}

和使用:

WakeUp w = new WakeUp(); 
       w.Woken += new EventHandler(w_Woken); 
       w.SetWakeUpTime(alarmDate.Subtract(new TimeSpan(0,0,0,20))); 

一切似乎唤醒我的电脑。

我知道这是可能的,因为其他几个闹钟都可以。他们设法没有问题地唤醒我的电脑,所以一定有一些错误。

+0

参考此链接http://social.msdn.microsoft.com/Forums/da-DK/csharpgeneral/thread/89002ed0-21e6-4429-ac9d-89ff5faed164 – JSJ

+0

相同的机制,因为我使用,不工作..啊啊! –

回答

1

问题不是所有的计算机都支持这个问题。如果你的电脑不支持它,显然没有多少事要做。

+0

支持什么问题?通过用户模式进程唤醒? –

相关问题