0

我制作了一个程序,它会在设定的时间后关闭 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();
}

然后信号 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 文件还是什么?

4

2 回答 2

2

一个简单的解决方法是将您部署的 exe 重命名为:shut .exe 或其他任何东西而不是shutdown .exe,然后系统将执行它的关闭命令而不是再次执行您的应用程序。

LE:可能还有其他方法可以解决这个问题,但我还没有对此进行调查……所以也要密切关注其他解决方案;)

于 2013-05-07T12:16:28.093 回答
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

编辑:您还需要正确的权限:

如何通过 Windows API 关闭电脑?

于 2013-05-07T11:34:24.080 回答