除了一个线程,我可以挂起进程吗?

时间:2013-05-22 05:40:55

标签: c++ dll mfc system

我将暂停(或暂停)除一个线程之外的进程。

我尝试使用SuspendThread(Api函数),结果是进程线程变为不负责任的状态。

这不是我想要的。我想让简历成为一个我必须做大工作的主题。

我该如何解决这个问题?请提出你的想法。

感谢。

2 个答案:

答案 0 :(得分:4)

您可以调用CreateToolhelp32Snapshot来获取属于某个进程的线程列表。一旦你有了这个列表,只需迭代它并暂停每个与当前线程ID不匹配的线程。以下示例未经测试,但应该可以正常工作。

#include <windows.h>
#include <tlhelp32.h>

// Pass 0 as the targetProcessId to suspend threads in the current process
void DoSuspendThread(DWORD targetProcessId, DWORD targetThreadId)
{
    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (h != INVALID_HANDLE_VALUE)
    {
        THREADENTRY32 te;
        te.dwSize = sizeof(te);
        if (Thread32First(h, &te))
        {
            do
            {
                if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID)) 
                {
                    // Suspend all threads EXCEPT the one we want to keep running
                    if(te.th32ThreadID != targetThreadId && te.th32OwnerProcessID == targetProcessId)
                    {
                        HANDLE thread = ::OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
                        if(thread != NULL)
                        {
                            SuspendThread(thread);
                            CloseHandle(thread);
                        }
                    }
                }
                te.dwSize = sizeof(te);
            } while (Thread32Next(h, &te));
        }
        CloseHandle(h);    
    }
}

答案 1 :(得分:0)

据我所知,你不能暂停一个进程,除了一个线程...因为当进程退出所有线程时也会退出。如果你想要而不是一个线程,你可以产生一个子进程并使用它..