暂停/恢复所有用户进程 - 这可能吗?

时间:2012-04-25 12:40:26

标签: c windows multithreading winapi multiprocessing

我有很多应用程序同时运行的PC,我想是可以暂停所有应用程序,我想这样做是为了定期运行另一个使用大量CPU的应用程序,所以希望它拥有所有应用程序处理器时间。 问题是我想暂停所有应用程序运行我的东西,使用CPU很多,然后当我的东西退出,恢复所有应用程序和所有工作恢复正常....

欢迎任何评论。

2 个答案:

答案 0 :(得分:5)

这是可能的,但根本不推荐。

设置进程和线程优先级,以便为应用程序提供更大的CPU片。 这也意味着它不会像你的方法那样杀死桌面,任何网络连接,防病毒,开始菜单,窗口管理器等。

答案 1 :(得分:0)

您可能会保留一个列表,您可以自己手动生成对程序要求太高的程序(例如(不好的例子)Steam.exe,chrome.exe,90GB-video-game.exe等)。基本上,您将获得所有正在运行的进程的完整列表,在该列表中搜索所有列入黑名单的名称,以及NtSuspendProcess / NtResumeProcess(您是否需要让它将来再次运行)。

我认为暂挂 all 个用户进程不是一个好主意。其中许多都受到了奇怪的保护,无论如何,它们可能仍会继续运行,这是一场艰苦的战斗,几乎没有收获。

如另一个答案中所述,如果您有权限,当然可以调整进程的优先级。这样可以对整个操作系统范围的进程列表进行排序,以适合您的进程,因此您可以首先获得CPU时间。

这是与您的原始请求类似的示例。我正在用C ++编写一个需要此确切功能的程序,所以我想我会帮忙的。这将找到Steam.exe或chrome.exe,并将其找到的第一个文件暂停10秒钟..然后将其恢复。如果您尝试在挂起的窗口中与之交互,则在Windows上将显示为“无响应”。某些应用可能不喜欢被暂停,YMMV。

/*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;
}