如何在指定时间自动打开计算机

How to Automatically Turn on a Computer at a Specified Time

本文关键字:计算机 定时间      更新时间:2023-10-16

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

正如一些人所说,据我所知,除非你使用另一台机器和局域网唤醒功能,否则不可能为相当多的电脑安排正常的电脑开机。但是,您可以使用可等待计时器从休眠或暂停中唤醒。可以通过SetSuspendState API函数以编程方式达到的两个状态。另外三个Windows API函数将帮助您使用第二种方法:

  1. 创建等待计时器
  2. 设置等待计时器
  3. 取消等待计时器

我不建议破解任何BIOS配置。为了安全起见,只需使用您的系统提供的API格式的文件。这些黑客有时会导致不想要的或意想不到的行为。

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

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

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

本教程中的更多信息

现在为了醒来。。。我认为在BIOS中没有Wake-on-Lan并设置客户端向其发送魔术包的情况下,在桌面上启动是不可能的。

因此,我认为最好的方法是让一个设备位于同一个子网上,以处理启动魔术包的发送。。。这不是一个很棒的选择,但如果你想要的是明确的关闭,那么在不手动的情况下恢复它的方法是有限的。

就像后台一样,魔术包地址帧是以以下格式完成的——6*255,也就是0xFF,目的地MAC地址重复了16次。因此,如果你的MAC地址是01:02:03:04:05:06,那么帧看起来是这样的:

ffffffffff 010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506

参见WOL迷你HOWTO-第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));**

局域网唤醒教程-参考C++示例

您可以使用批处理文件并在其中进行编码来关闭。一旦计算机关闭,就不可能用任何语言打开它,因为这是硬件要求。

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

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

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

显然,当计算机在上时,这种硬件应该是可编程的

您可以使用shell调用shutdown命令关闭电脑。

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

你必须在第二台电脑上运行你的程序,并发送一些通常被称为魔术包的数据包,使用MAC寻址,即你的电脑的局域网

你可以在这里阅读更多http://en.wikipedia.org/wiki/Wake-on-LAN