判定元件 typedef LONG(NTAPI*NtSuspendProcess)(在句柄进程句柄中); typedef LONG(NTAPI*NtResumeProcess)(在句柄进程句柄中); NtSuspendProcess dSuspendPro

判定元件 typedef LONG(NTAPI*NtSuspendProcess)(在句柄进程句柄中); typedef LONG(NTAPI*NtResumeProcess)(在句柄进程句柄中); NtSuspendProcess dSuspendPro,c,windows,multithreading,winapi,multiprocessing,C,Windows,Multithreading,Winapi,Multiprocessing,判定元件 typedef LONG(NTAPI*NtSuspendProcess)(在句柄进程句柄中); typedef LONG(NTAPI*NtResumeProcess)(在句柄进程句柄中); NtSuspendProcess dSuspendProcess=nullptr; NtResumeProcess-dResumeProcess=nullptr; int获取_pid(){ DWORD procs[4096],字节; int out=-1; if(!enumprocess(procs

判定元件 typedef LONG(NTAPI*NtSuspendProcess)(在句柄进程句柄中); typedef LONG(NTAPI*NtResumeProcess)(在句柄进程句柄中); NtSuspendProcess dSuspendProcess=nullptr; NtResumeProcess-dResumeProcess=nullptr; int获取_pid(){ DWORD procs[4096],字节; int out=-1; if(!enumprocess(procs,sizeof(procs),&bytes)){ 返回-1; } 对于(大小i=0;i听起来对我来说是一个严重的安全风险…所有用户(如您)或所有用户(如每个人)登录系统?让一个应用程序占用CPU的最好方法是赋予进程更高的优先级。Windows调度程序的工作方式是,只要不满足更高优先级的任务,其他人就不会得到一点CPU。这比遍历进程列表并逐个挂起它们要容易得多(而且更安全,想象一下您的进程在挂起其他所有进程后崩溃……)。当然,你最好确保你的程序永远不可能挂起……FWIW,对于占用CPU的进程,我通常的策略是降低它们的优先级:如果你试图使用电脑,它们可能会损失几%的CPU,但是(1)如果你让电脑闲置,它们几乎不会损失任何东西;(2)如果你需要对机器执行任何操作,你仍然需要保持机器的响应能力(例如,如果它卡住了,杀死占用CPU的应用程序)。@MatteoItalia是的,大多数台式PC都有很多进程/线程,幸运的是,大多数都没有做任何事情。目前运行1358台,CPU使用率约为2%。这是不值得尝试拿走2%的。听起来对我来说是一个严重的安全风险…所有用户(像你一样)还是所有用户(像每个登录系统的人一样)?让一个应用程序占用CPU的最好方法是赋予进程更高的优先级。Windows调度程序的工作方式是,只要不满足更高优先级的任务,其他人就不会得到一点CPU。这比遍历进程列表并逐个挂起它们要容易得多(而且更安全,想象一下您的进程在挂起其他所有进程后崩溃……)。当然,你最好确保你的程序永远不可能挂起……FWIW,对于占用CPU的进程,我通常的策略是降低它们的优先级:如果你试图使用电脑,它们可能会损失几%的CPU,但是(1)如果你让电脑闲置,它们几乎不会损失任何东西;(2)如果你需要对机器执行任何操作,你仍然需要保持机器的响应能力(例如,如果它卡住了,杀死占用CPU的应用程序)。@MatteoItalia是的,大多数台式PC都有很多进程/线程,幸运的是,大多数都没有做任何事情。目前运行1358台,CPU使用率约为2%。不值得尝试将这2%拿走。它实际上不会杀死任何一个这样的东西,但设置在关键优先级运行的[核心数]线程是非常非常糟糕的。电源开关坏了。它实际上不会杀死这些东西中的任何一个,但是设置在关键优先级时运行的[核心数]线程是非常非常糟糕的。电源开关坏了。
/*Find, suspend, resume Win32 C++
 *Written by jimmio92. No rights reserved. Public domain. 
 *NO WARRANTY! NO LIABILITY! (obviously)
*/

#include <windows.h>
#include <psapi.h>

typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
typedef LONG (NTAPI *NtResumeProcess)(IN HANDLE ProcessHandle);
NtSuspendProcess dSuspendProcess = nullptr;
NtResumeProcess dResumeProcess = nullptr;

int get_the_pid() {
    DWORD procs[4096], bytes;
    int out = -1;

    if(!EnumProcesses(procs, sizeof(procs), &bytes)) {
        return -1;
    }
    for(size_t i = 0; i < bytes/sizeof(DWORD); ++i) {
        TCHAR name[MAX_PATH] = "";
        HMODULE mod;
        HANDLE p = nullptr;
        bool found = false;

        p = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, procs[i]);

        if(p == nullptr)
            continue;

        DWORD unused_bytes_for_all_modules = 0;

        if(EnumProcessModules(p, &mod, sizeof(mod), &unused_bytes_for_all_modules)) {
            GetModuleBaseName(p, mod, name, sizeof(name));

            //change this to use an array of names or whatever fits your need better
            if(strcmp(name, "Steam.exe") == 0 || strcmp(name, "chrome.exe") == 0) {
                out = procs[i];
                found = true;
            }
        }

        CloseHandle(p);
        if(found) break;
    }

    return out;
}

void suspend_process_by_id(int pid) {
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    if(h == nullptr)
        return;

    dSuspendProcess(h);
    CloseHandle(h);
}
void resume_process_by_id(int pid) {
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    if(h == nullptr)
        return;

    dResumeProcess(h);
    CloseHandle(h);
}

void init() {
    //load NtSuspendProcess from ntdll.dll
    HMODULE ntmod = GetModuleHandle("ntdll");

    dSuspendProcess = (NtSuspendProcess)GetProcAddress(ntmod, "NtSuspendProcess");
    dResumeProcess = (NtResumeProcess)GetProcAddress(ntmod, "NtResumeProcess");
}

int main() {
    init();

    int pid = get_the_pid();
    if(pid < 0) {
        printf("Steam.exe and chrome.exe not found");
    }

    suspend_process_by_id(pid);

    //wait ten seconds for demonstration purposes
    Sleep(10000);

    resume_process_by_id(pid);

    return 0;
}