【问题标题】:How to Automatically Turn on a Computer at a Specified Time如何在指定时间自动开启计算机
【发布时间】:2014-10-25 12:59:48
【问题描述】:

我正在编写一个 C++ 程序。 这个程序在运行时应该有一个时间,在关闭系统后,在指定的时间自动打开。 我搜索但找不到我的问题答案。 我的操作系统是 Windows 7 和 8。 我的硬件是 1-主板:华硕,CPU:AMD 或 2-主板:技嘉,CPU:英特尔 谢谢。

【问题讨论】:

标签: c++ windows boot


【解决方案1】:

您可以使用批处理文件并在其中进行编码来关闭。 任何语言的计算机关机后都无法开机,因为这是硬件要求。

【讨论】:

  • 但是某些程序(例如“自动开机和关机”)会在指定时间自动打开
  • @negarsalehi,该程序看起来只是唤醒计算机而不是实际打开它。
【解决方案2】:

您可以通过编程方式将计算机从睡眠模式(不是关机状态)打开。

作为第二种选择,您可以添加一些自定义外部硬件来触发开机事件(按下电源开关、局域网唤醒、响铃唤醒、键盘空格键按下、电源电缆上的绿黑线直接接触以及许多其他人)

一个 DIY 可编程 WOL 魔术包发送器的示例: http://forum.arduino.cc/index.php/topic,15330.0.html

显然这样的硬件在计算机开机时应该是可编程的

【讨论】:

  • 但是某些程序(例如“自动开机和关机”)会在指定时间自动打开
  • @negarsalehi 他们只能从睡眠或冬眠中醒来(根据他们的说法)。不是完全关闭。
【解决方案3】:

我已经重做这个答案以回应留下的评论......

首先对于关闭命令尝试以下操作:

main()
{
          system("c:\\WINDOWS\\System32\\shutdown /s /t 0");
          return 0; 
}

Further information at this tutorial

现在起床了…… 我认为在 BIOS 中没有 Wake-On-Lan 的情况下无法在桌面上启动,并设置客户端向其发送魔术包。

所以我认为最好的方法是让一个设备位于同一子网上来处理启动魔术包的发送......这不是一个很棒的选择,但如果你正在寻找明确的关机,那么有限无需手动操作即可重新启动它的方法。

就像背景一样,魔术包地址帧以以下格式完成 - 6*255 又名 0xFF,目标 MAC 地址重复 16 次。因此,如果您的 MAC 地址为 01:02:03:04:05:06,则帧将如下所示:

FFFFFFFFFFFF010203040506010203040506010203040506010203040506 010203040506010203040506010203040506010203040506010203040506 010203040506010203040506010203040506010203040506010203040506 010203040506010203040506

See WOL Mini HOWTO - Chapter 2

在 C++ 中,数据包本身可以这样构造,在目标地址的每个部分输入转换。

unsigned char tosend[102];
unsigned char mac[6];

/** first 6 bytes of 255 **/
for(int i = 0; i < 6; i++) {
tosend[i] = 0xFF;
}
/** store mac address **/
mac[0] = 0x01;
mac[1] = 0x02;
mac[2] = 0x03;
mac[3] = 0x04;
mac[4] = 0x05;
mac[5] = 0x06;
/** append it 16 times to packet **/
for(int i = 1; i <= 16; i++) {
memcpy(&tosend[i * 6], &mac, 6 * sizeof(unsigned char));
}

然后像这样创建一个发送方,它将向子网上的所有设备广播数据包,但刚刚构建的帧会传达 MAC 地址:

int udpSocket;
struct sockaddr_in udpClient, udpServer;
int broadcast = 1;

udpSocket = socket(AF_INET, SOCK_DGRAM, 0);

/** you need to set this so you can broadcast **/
if (setsockopt(udpSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast) == -1)     {
perror(“setsockopt (SO_BROADCAST)”);
exit(1);
}

udpClient.sin_family = AF_INET;
udpClient.sin_addr.s_addr = INADDR_ANY;
udpClient.sin_port = 0;

bind(udpSocket, (struct sockaddr*)&udpClient, sizeof(udpClient));

/**make packet as shown above**/

**/** set server end point (the broadcast address)**/
udpServer.sin_family = AF_INET;
udpServer.sin_addr.s_addr = inet_addr(“192.168.1.255″);
udpServer.sin_port = htons(9);

/** send the packet **/
sendto(udpSocket, &tosend, sizeof(unsigned char) * 102, 0, (struct sockaddr*)&udpServer,     sizeof(udpServer));**

Wake on LAN tutorial - reference for C++ example

【讨论】:

  • 既然你确实做了这个答案,那就一路走下去。此处没有任何材料的外部链接被认为是不好的,因为它们可能会失效,因此未来的读者不会从您的答案中获得任何收益。把该教程中的要点放在这里(如有必要,根据 OP 的需要调整它们),我会支持你的答案。
  • 谢谢 bolov - 我已按照指示重做我的答案。感谢您提供反馈而不是投反对票。
【解决方案4】:

您可以使用 shell 调用关机命令来关闭您的 PC。

对于启动,大多数 BIOS 支持 LAN 唤醒。

您必须在第二台 PC 上运行您的程序,并发送一些通常称为魔术数据包的数据包,这些数据包使用 MAC 寻址,以便打开您的 PC 的 LAN。

你可以在这里http://en.wikipedia.org/wiki/Wake-on-LAN了解更多信息

【讨论】:

    【解决方案5】:

    正如一些人所说,据我所知,除非您使用另一台机器和wake on LAN 功能,否则无法为相当多的 PC 安排正常的 PC 开机。 但是,您可以使用waitable timers 从休眠或挂起中唤醒。可以通过SetSuspendState API 函数以编程方式达到的两个状态。其他 三个 Windows API 函数将帮助您使用第二种方法:

    1. CreateWaitableTimer
    2. SetWaitableTimer
    3. CancelWaitableTimer

    我完全不建议破解任何 BIOS 配置。为了安全起见,只需使用您的系统以有据可查的 API 的形式提供的内容。这些黑客攻击有时会导致不良或意外行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多