我制作了一个程序,在一段时间后关闭PC。 用户使用2个旋转框输入时间(一个用于小时,另一个用于分钟), 然后我把它转换为毫秒:
ms = (ui->hBox->text().toInt() * 3600 + ui->mBox->text().toInt() * 60) * 1000;
然后调用timer()函数
void Dialog::timer()
{
QTimer *time = new QTimer(this);
time->setInterval(ms);
time->setSingleShot(1);
connect(time, SIGNAL(timeout()), this, SLOT(shutdown()));
time->start();
}
然后signal timeout()调用shutdown()插槽/函数,检查用户是否要关闭,重新启动或注销PC,然后执行适当的命令。
void Dialog::shutdown()
{
if(ui->radioButton->isChecked())
system("shutdown -s -t 0");
else if(ui->radioButton_2->isChecked())
system("shutdown -r -t 0");
else if(ui->radioButton_3->isChecked())
system("shutdown -l -t 0");
}
(也试过“shutdown -s -f”,甚至只有“shutdown -s”,似乎没有什么能帮助解决问题)
我想只在我的Windows PC上运行此应用程序,因此使用system()也不是问题。
当我从Qt Creator运行它时,上面的应用程序执行得很好,但是当我部署它时,放入所有需要的.dll文件,程序等待计时器然后只打开空控制台然后启动程序的新实例,PC永远不要关闭或重启。 那么我做错了什么?我错过了一些.dll文件吗?
答案 0 :(得分:2)
一个简单的解决方法是将已部署的exe重命名为: shut .exe或任何代替 shutdown .exe,然后系统将执行它的关闭命令,而不是再次执行您的应用程序。
LE:可能还有其他方法可以解决这个问题,但我没有对此进行过调查......所以也要保持其他解决方案;)
答案 1 :(得分:0)
使用system()是不安全的。更好的解决方案是使用Win32 API调用ExitWindowEx()。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx
当然,因为这只是windows,所以你必须为Windows平台#ifdef。
#ifdef Q_OS_WIN
#include "qt_windows.h"
if ( !ExitWindowsEx(EWX_SHUTDOWN,0)) // Or EWX_FORCE
{
// Failed, call GetLastError() to know why
}
#endif
编辑:您还需要正确的权限: