C++ 如何确定进程是否已暂停?

C++ 如何确定进程是否已暂停?,c++,process,suspend,C++,Process,Suspend,我将此代码用于挂起进程。我在此处找到它 BOOL SuspendResumeThreadList(DWORD dwOwnerPID,BOOL bResumeThread) { 句柄hThreadSnap=NULL; 布尔-布雷特=假; THREADENTRY32 te32={0}; hThreadSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPTHREAD,0); if(hThreadSnap==无效的\u句柄\u值) 返回(假); te32.dwSize

我将此代码用于挂起进程。我在此处找到它

BOOL SuspendResumeThreadList(DWORD dwOwnerPID,BOOL bResumeThread)
{ 
句柄hThreadSnap=NULL;
布尔-布雷特=假;
THREADENTRY32 te32={0};
hThreadSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPTHREAD,0);
if(hThreadSnap==无效的\u句柄\u值)
返回(假);
te32.dwSize=sizeof(THREADENTRY32);
if(Thread32First(hThreadSnap,&te32))
{ 
做
{ 
if(te32.th32OwnerProcessID==dwOwnerPID)
{
HANDLE hThread=OpenThread(THREAD\u SUSPEND\u RESUME,FALSE,te32.th32ThreadID);
if(bResumeThread)
{

//如果我没记错的话,你可以用于这个目的。使用
NtQuerySystemInformation
你可以通过迭代
SYSTEM\u PROCESS\u INFORMATION
数组并查找目标进程的PID来获得
SYSTEM\u PROCESS\u INFORMATION
结构。你可以找到
SYSTEM\u PROCESS\u INFORMATION的详细描述在Wine sources中的
上。获取流程信息结构后,只需查看系统线程信息
即可检查线程状态。有关结构和枚举的更多详细信息,请查看Wine sources。

什么是“流程已挂起”?只有线程可以挂起。一旦进程的所有线程都挂起,您可以将其定义为挂起-这也为您提供了一种方法来检测它。谢谢,但是我如何检查线程是否挂起???没有记录在案的API来执行此操作。如果您需要此类信息,您必须检查线程环境t block,这是一个可以在不同版本的windows.Yup上更改的实现细节。声明唯一真正可靠的来源是在所有地方的.NET framework.NtProcessInfoHelper类中。使用WMI Win32_线程类可以消除依赖性。只需一大块盐就可以得到任何东西,没有什么比这更易变的了然后是线程状态。无法冻结操作系统。@Hans Passan:感谢您指出NtProcessInfoHelper类。我不知道,只是用reflector检查了一下。
BOOL SuspendResumeThreadList(DWORD dwOwnerPID, bool bResumeThread) 
{ 
    HANDLE        hThreadSnap = NULL; 
    BOOL          bRet        = FALSE; 
    THREADENTRY32 te32        = {0}; 

    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
    if (hThreadSnap == INVALID_HANDLE_VALUE) 
        return (FALSE); 

    te32.dwSize = sizeof(THREADENTRY32); 

    if (Thread32First(hThreadSnap, &te32)) 
    { 
        do 
        { 
            if (te32.th32OwnerProcessID == dwOwnerPID) 
            {
                HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);
                if (bResumeThread)
                {
                    //cout << _T("Resuming Thread 0x") << cout.setf( ios_base::hex ) << te32.th32ThreadID << '\n';
                    ResumeThread(hThread);
                }
                else
                {
                    //cout << _T("Suspending Thread 0x") << cout.setf( ios_base::hex ) << te32.th32ThreadID << '\n';
                    SuspendThread(hThread);
                }
                CloseHandle(hThread);
            } 
        }
        while (Thread32Next(hThreadSnap, &te32)); 
        bRet = TRUE; 
    } 
    else 
        bRet = FALSE;   
    CloseHandle (hThreadSnap); 
    return (bRet); 
}