我正在编写一个C ++程序。 这个程序在运行时应该得到一个时间并在关闭系统后,在指定时间自动开启。 我搜索但找不到我的问题答案。 我的操作系统是Windows 7和8。 我的硬件是1-主板:华硕,CPU:AMD或2-主板:技嘉,CPU:英特尔 感谢。
答案 0 :(得分:3)
正如有些人所说,并且据我所知,除非你使用另一台机器和wake on LAN功能,否则无法为相当多的PC安排正常的PC开机。 但是,您可以使用waitable timers从休眠或暂停中唤醒。可以通过SetSuspendState API函数以编程方式访问两个状态。其他 三个Windows API函数将帮助您使用第二种方法:
我建议不要破解任何BIOS配置。为了安全起见,只需使用系统提供的文档,并以文档齐全的API形式提供。这些黑客有时会导致意外或意外的行为。
答案 1 :(得分:1)
我在回复留下的评论时重新回答了这个问题......
首先,对于shutdown命令,请尝试以下操作:
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));**
答案 2 :(得分:0)
您可以使用批处理文件进行关闭并进行编码。 一旦以任何语言关闭计算机,就无法打开计算机,因为这是硬件要求。
答案 3 :(得分:0)
您可以通过编程方式将计算机从睡眠模式打开(不是关闭电源状态)。
作为第二种选择,您可以添加一些自定义外部硬件来触发开启事件(按下电源开关,网络唤醒,环网唤醒,键盘空格键按下,电源线上的直接绿黑线接触以及许多其他人)
DIY可编程WOL魔术包发送器的示例: http://forum.arduino.cc/index.php/topic,15330.0.html
显然,当计算机处于打开状态时,此类硬件应该是可编程的
答案 4 :(得分:0)
您可以使用shell关闭PC调用shutdown命令。
启动时,大多数BIOS支持LAN唤醒。
你必须在第二台PC上运行你的程序,然后发送一些通常被称为魔术包的数据包,这些数据包使用MAC来解决你的PC的局域网。
了解更多信息