2010-10-31 58 views
9

是否有任何Win32 API在特定時間喚醒已關閉的系統?我看到一個名爲Autopower On的程序,它可以在指定的時間啓動系統。C#:如何喚醒已關閉的系統?

+3

你什麼時候運行這個C#程序?電腦關機了嗎?或者在它關閉之前? – Gabe 2010-10-31 04:29:20

+0

我在關閉之前運行此程序。 – vishnu 2010-10-31 04:31:04

+0

您需要深入研究ACPI。有一點谷歌搜索說你可以通過WMI訪問它,但我不確定它在多大程度上。 – Brad 2010-10-31 04:33:57

回答

11

得到the below post從網站。任何機構都試過這個?

沒有什麼框架,所以你必須「PInvoke」一點。 您需要調用的API是CreateWaitableTimer和SetWaitableTimer。 以下是一個完整的(Q & D)示例,演示瞭如何使用上面的Win32 API從睡眠/休眠狀態喚醒系統 。 請注意,這裏我設置了300000000 nSecs的相對喚醒時間。 這意味着計算機將在設置計時器後的30秒內喚醒(假設他已睡着或者休眠 )。 有關SetWaitableTimer及其參數的詳細信息,請查閱MSDN文檔。

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"); 
     } 
    } 
} 
+4

我編輯了程序,使其工作。我已經驗證它將我的電腦從睡眠和休眠狀態喚醒。但是,我不認爲它會從關機中醒來。 – Gabe 2010-10-31 05:18:48

+0

@加布:好的。感謝編輯 – vishnu 2010-10-31 10:20:39

+0

我已經在Windows 8桌面和平板電腦上試過這段代碼,但它不起作用。是否必須使用支持此功能的設備執行某些操作,或者所有設備都支持喚醒選項?我在高級電源設置中查看了睡眠選項下的允許喚醒計時器選項,但在桌面工具和平板電腦上也可以選擇使用 – 2013-10-29 18:03:35

2

Wake on LAN (WOL)代碼項目後可能會使用(無論主板和網卡必須支持WOL)

2

一旦你真的關閉了你的電腦(不睡覺或休眠),你不能直接從C#,C++代碼喚醒它。所有操作系統本身都關閉後。

唯一的機會是你的主板支持某種定時器機制。用一些C++函數可以將一些標誌寫入BIOS並設置該定時器。

-1

使用窗口「計劃任務」菜單。請參閱:

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

創建要在喚醒手動運行,然後進入計劃任務列表中的第一次特定的時間後喚醒窗口的程序。

當你編程喚醒時,我不確定你是否需要你的程序調用一個Windows API到 停止它被再次喚醒,同樣如果你想讓你的程序在啓動另一個調度任務喚醒它後關閉PC再次。需要重新研究一下Windows API。

+1

這是一個適合超級用戶的非編程答案。它不回答被問到的編程問題,但是,這需要從C#配置喚醒。 – 2014-11-23 00:38:02