如何使用cpp程序强制关闭电脑

问题描述 投票:0回答:3

我一直在做一个小项目。我正在为我弟弟的电脑制作一个计时器,这样他一天使用电脑的时间就不能超过我设定的时间。 我在代码中面临的问题是我尝试了一堆系统命令来自动关闭计算机,但是当它运行命令时,它会询问是否关闭正在运行的应用程序。但我想强制关闭所有正在运行的应用程序。下面是我正在尝试的代码,但它不太有效

system("C:\\Windows\\System32\\shutdown /s /t 0");

现在这条语句在执行时会要求关闭正在运行的应用程序或取消关闭进程

ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
    SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
    SHTDN_REASON_MINOR_UPGRADE |
    SHTDN_REASON_FLAG_PLANNED);

我从 Microsoft 文档中获得了上述函数,但它在我的计算机上不起作用,即使它在该语句中没有显示任何错误。但即使执行后也不起作用。此外,Visual Studio 还提供了自己的使用新 API 的建议,如下所示

InitiateSystemShutdownEx(NULL, NULL, 0, true, false, SHTDN_REASON_FLAG_USER_DEFINED);

即使执行,这也不起作用。我正在使用 Windows 11。下面我给出了我到达的完整代码

#include <iostream>
#include <stdlib.h>
#include<Windows.h>
#include<fstream>
#pragma warning(disable : 4996)
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "advapi32.lib")
using namespace std;


void timer()
{
    int hours=0;
    int minutes=0;
    int seconds=0;
    ofstream tim;
    while (seconds != 5)
    {
        tim.open("time.txt", ios::out | ios::trunc);
        seconds++;
        Sleep(1000);
        if (seconds == 60)
        {
            minutes++;
            seconds = 0;
        }
        if (minutes == 60)
        {
            hours++;
            minutes = 0;
        }
        tim << hours << endl << minutes << endl << seconds;
        tim.close();
    }
}

int main()
{
    timer();
    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
        SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
        SHTDN_REASON_MINOR_UPGRADE |
        SHTDN_REASON_FLAG_PLANNED);
    cout << endl << endl;
    return 0;
}

所以请任何类型的帮助,我们将不胜感激。

c++ winapi shutdown
3个回答
1
投票

您需要添加

/f
标志来强制关闭。


0
投票

这是我多年前遇到类似问题时创建的实际注销功能。 这里有很多额外的代码来支持调试而无需注销自己,实际工作是对

ExitWindowsEx
的调用。

void CTimeLimitApp::Logoff()
{
    static bool bOff = false;
    if (bOff)
        return;
    bOff = true;
#if _DEBUG
    AfxMessageBox("Logoff!", MB_OK, 0);
    PostQuitMessage(0);
#else
    Sleep(1000);
    ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, 0);
#endif
}

如果您想完全关闭,您可能需要以管理员身份运行该程序。


0
投票
bool RebootPC()
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;

    // Get a token for this process.
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        std::cerr << "OpenProcessToken failed. Error: " << GetLastError() << '\n';
        return false;
    }

    // Get the LUID for the shutdown privilege.
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

    tkp.PrivilegeCount = 1;  // one privilege to set
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    // Get the shutdown privilege for this process.
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

    if (GetLastError() != ERROR_SUCCESS)
    {
        std::cerr << "AdjustTokenPrivileges failed. Error: " << GetLastError() << '\n';
        return false;
    }

    // Shut down the system and force all applications to close
    if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE | EWX_FORCEIFHUNG, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED))
    {
        std::cerr << "ExitWindowsEx failed. Error: " << GetLastError() << '\n';
        return false;
    }

    return true;
}
© www.soinside.com 2019 - 2024. All rights reserved.