如何在指定时间自动打开计算机 我正在编写一个C++程序。 本程序运行时应得到一个时间,并在关闭系统后,在指定时间自动开启。 我搜索了一下,但找不到我的问题和答案。 我的操作系统是Windows7和Windows8。 我的硬件是1-主板:华硕,CPU:AMD或2-主板:千兆字节,CPU:Intel 谢谢。

如何在指定时间自动打开计算机 我正在编写一个C++程序。 本程序运行时应得到一个时间,并在关闭系统后,在指定时间自动开启。 我搜索了一下,但找不到我的问题和答案。 我的操作系统是Windows7和Windows8。 我的硬件是1-主板:华硕,CPU:AMD或2-主板:千兆字节,CPU:Intel 谢谢。,c++,windows,boot,C++,Windows,Boot,您可以使用批处理文件关闭并在其中编码。 一旦计算机以任何语言关闭,就无法打开计算机,因为这是一项硬件要求。您可以通过编程方式从睡眠模式(非关机状态)打开计算机 作为第二个选项,您可以添加一些自定义外部硬件来触发开机事件(按下电源开关、LAN唤醒、铃声唤醒、键盘空格键按下、电源电缆上的直接绿-黑导线触点以及其他许多) DIY可编程WOL魔术包发送器示例: 很明显,当电脑开机时,这样的硬件应该是可编程的。我重新做了这个回答,以回应留下的评论 首先,对于shutdown命令,请尝试以下操作: mai

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

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

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

DIY可编程WOL魔术包发送器示例:


很明显,当电脑开机时,这样的硬件应该是可编程的。我重新做了这个回答,以回应留下的评论

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

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

现在醒来。。。 我不认为在没有在BIOS中唤醒Lan的情况下在桌面上启动,并设置客户端向其发送神奇数据包是可能的

所以我认为最好的方法是在同一子网上安装一个设备来处理启动魔法包的发送。。。这不是一个很好的选择,但是如果你想要的是明确的关机,那么不需要手动操作就可以重新启动它的方法是有限的

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

FFFFFFFFFF010203040506010203040506010203040506010203040506010203040506010203040506 010203040506010203040506010203040506010203040506010203040506 010203040506010203040506010203040506010203040506010203040506 010203040506010203040506

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));
}

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

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

你必须在第二台电脑上运行你的程序,并发送一些数据包,这些数据包通常被称为魔法数据包,使用MAC地址发送到你电脑的LAN上才能打开


你可以在这里更多地了解它

正如一些人所说,据我所知,除非你使用另一台机器和该功能,否则不可能为相当大范围的PC安排正常的PC开机。 然而,你可以用它从冬眠或暂停中醒来。可以通过API函数以编程方式访问的两个状态。其他 三个Windows API函数将帮助您实现第二种方法:


  • 我不建议对任何BIOS配置进行黑客攻击。为了安全起见,只需使用系统以良好记录的API形式提供的内容。这些黑客行为有时会导致不受欢迎或意外的行为。

    请看这篇文章的第二个答案。我认为您需要使用bios设置,但我从未尝试过:但某些程序(例如“自动开机和关机”)会在指定的时间自动打开time@negarsalehi,该程序看起来只是唤醒计算机,而不是真正打开计算机。但有些程序(例如“自动开机和关机”)在指定的时间自动打开time@negarsalehi他们声称,他们只能从睡眠或冬眠中醒来。不是从完全关闭开始的。既然你已经回答了这个问题,那就一直走下去。这里没有任何材料的外部链接被认为是不好的,因为它们可能会失效,所以未来的读者不会从你的答案中得到任何东西。把那个教程中的要点放在这里(如果必要的话,根据OP的需要调整它们),我会更新你的答案。谢谢博洛夫-我已经按照指示重做了我的答案。感谢您提供反馈,而不是否决票。
    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));**