C#:如何唤醒已关闭的系统?

Posted

技术标签:

【中文标题】C#:如何唤醒已关闭的系统?【英文标题】:C#: How to wake up system which has been shutdown? 【发布时间】:2011-05-02 23:43:32 【问题描述】:

是否有任何 Win32 API 用于在特定时间唤醒已关闭的系统?我见过一个名为 Autopower On 的程序,它能够在指定的时间启动系统。

【问题讨论】:

什么时候运行这个 C# 程序?电脑关机的时候?还是在关闭之前? 我在关闭之前运行这个程序。 您需要深入研究 ACPI。谷歌搜索了一下说你可以用 WMI 访问它,但我不确定到什么程度。 @Brad:我应该用谷歌搜索什么?告诉我一些要搜索的关键字。 自动开机程序 (lifsoft.com) 在计算机关闭时不起作用。它仅适用于睡眠/休眠的计算机。 【参考方案1】:

这个Wake on LAN (WOL) 代码项目帖子可能有用(主板和网卡都必须支持 WOL)

【讨论】:

【参考方案2】:

从一个站点获得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");
        
    

【讨论】:

我编辑了这个程序,让它工作。我已经验证它可以将我的计算机从睡眠和休眠状态唤醒。但是,我不希望它从关机中醒来。 我已经在 Windows 8 台式机和平板电脑上尝试过此代码,但它不起作用。它是否与我支持此功能的设备有关,或者所有设备都支持唤醒选项?我查看了高级电源设置中睡眠选项下的允许唤醒计时器选项,但在桌面端工作和平板电脑端也可以更改该选项 在该网站上有一些警告,您还需要确保您不需要输入密码来唤醒它/唤醒它,并在睡眠设置中允许唤醒计时器。跨度> 【参考方案3】:

一旦您真正关闭了计算机(不是睡眠或休眠),您就无法直接从 C#、C++ 代码中将其唤醒。毕竟操作系统本身是关闭的。

唯一的机会是您的主板支持某种定时器机制。并且通过一些 C++ 函数能够将一些标志写入 Bios 并设置该计时器。

【讨论】:

【参考方案4】:

使用 Windows 的“计划任务”菜单。见:

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

您创建了一个您希望在唤醒时运行的程序,然后手动将其输入到 Windows 计划任务列表中,以便在特定时间后首次唤醒。

当您的程序唤醒时,我不确定您是否需要您的程序调用 Windows API 停止再次唤醒它,如果您希望程序在启动另一个计划任务后关闭 PC 以再次唤醒它,则同上。需要为此研究有哪些 Windows API。

【讨论】:

这是一个适合超级用户的非编程答案。但是,它没有回答所提出的编程问题,这需要从 C# 配置唤醒。

以上是关于C#:如何唤醒已关闭的系统?的主要内容,如果未能解决你的问题,请参考以下文章

苹果唤醒功能怎么关闭

C#客户端 怎么知道wcf服务 已关闭

如果设备已被唤醒或进入睡眠状态,如何检查应用程序

如何在套接字关闭时唤醒 select()?

已终止的应用程序未使用 iBeacon 数据包唤醒

Android 监听屏幕唤醒和关闭的广播