15

プログラムで Windows XP (またはそれ以降) のマシンを特定の時間に起動させる最善の方法は何ですか? (理想的には、Media Center が特定のテレビ番組を録画するために自動的に起動する方法とよく似ています)

Windows サービス (C# で記述) があり、このサービスがホストされているマシンを所定の時間に起動できるようにしたいと考えています。

これが正しく機能するために構成する必要がある BIOS 設定または前提条件 (ACPI など) はありますか?

このマシンはダイヤルアップまたは 3G ワイヤレス モデムを使用するため、残念ながら Wake on LAN に依存することはできません。

4

4 に答える 4

12

待機可能なタイマーを使用して、サスペンドまたは休止状態から復帰できます。私が見つけた限りでは、通常のシャットダウン モード (ソフト オフ/S5) からプログラムでウェイクアップすることはできません。その場合、BIOS で WakeOnRTC アラームを指定する必要があります。C# から待機可能なタイマーを使用するには、 pInvokeが必要です。インポート宣言は次のとおりです。

public delegate void TimerCompleteDelegate();

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long pDueTime, int lPeriod, TimerCompleteDelegate pfnCompletionRoutine, IntPtr pArgToCompletionRoutine, bool fResume);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CancelWaitableTimer(IntPtr hTimer);

これらの関数は、次の方法で使用できます。

public static IntPtr SetWakeAt(DateTime dt)
{
    TimerCompleteDelegate timerComplete = null;

    // read the manual for SetWaitableTimer to understand how this number is interpreted.
    long interval = dt.ToFileTimeUtc(); 
    IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer");
    SetWaitableTimer(handle, ref interval, 0, timerComplete, IntPtr.Zero, true);
    return handle;
}

CancelWaitableTimer次に、返されたハンドルを引数として使用して、待機可能なタイマーをキャンセルできます。

プログラムは、pInvoke を使用して休止状態とスリープ状態にすることができます。

[DllImport("powrprof.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetSuspendState(bool hibernate, bool forceCritical, bool disableWakeEvent);

public static bool Hibernate()
{
    return SetSuspendState(true, false, false);
}

public static bool Sleep()
{
    return SetSuspendState(false, false, false);
}

お使いのシステムでは、プログラムがコンピュータを休止状態にすることを許可していない場合があります。次のメソッドを呼び出して、休止状態を許可できます。

public static bool EnableHibernate()
{
    Process p = new Process();
    p.StartInfo.FileName = "powercfg.exe";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.StartInfo.Arguments = "/hibernate on"; // this might be different in other locales
    return p.Start();
}
于 2011-10-27T17:57:17.690 に答える
4

Win7 のタスク スケジューラ プログラム、taskschd.msc (および XP もそうだと思います) は、さまざまなトリガーでシステムを起動するように設定できます。これらのトリガーは、スケジュール、時間、イベントなどです。

少なくとも Win7 では、これを機能させるには、"Allow Wake Timers" を "Enabled" に設定する必要があります。この設定は以下にあります...

--> コントロール パネル\ハードウェアとサウンド\電源オプション
クリック - 「プラン設定の編集」
クリック - 「詳細な電源設定の変更」
展開 - 「スリープ」 展開 - 「スリープ
解除タイマーを許可」

于 2010-09-21T22:22:37.530 に答える
2

最善の策は、Wake on LAN機能を使用することです。これには、別のマシンが特別な種類のパケットを送信してマシンを起動する必要があります。

これは、マシンがネットワークに接続されていない場合や、何らかの理由でこのロジックを別のマシンに移動していない場合には役に立ちません。ただし、複数のマシンがあり、それらをプログラムでウェイクアップする必要がある一部の構成では便利です。

于 2009-07-17T07:16:43.217 に答える
0

一部のマシンには、特定の時間にコンピューターをウェイクアップするように設定できるBIOS目覚まし時計があります。この時計をプログラムすることは可能であるはずですが、具体的な詳細はわかりません。

編集:私はあなたが時間を設定できるはずのこのプログラムを見つけました。LinuxではCですが、ヒントが得られるかもしれません。

ただし、警告:BIOS設定を直接変更する前に、BIOS画面からすべての設定を書き留めてください。エラーが発生した場合、BIOSが工場出荷時のデフォルトに戻り、元の状態に再設定する必要がある場合があります。

于 2009-07-17T07:03:32.463 に答える