1. #include <iostream>
    2. #include <windows.h>
    3. #include <TlHelp32.h>
    4. // 在线程内核对象对应的结构体中,有一个挂起计数,只有当挂起计数为 0 的时候,线程才会被调度(执行),
    5. // 可以使用 ResumeThread 让挂起计数 -1,使用 Susepend 函数让挂起计数 +1。
    6. // 查找指定窗口对应的进程id
    7. DWORD FindProcessId(LPCWSTR WindowName)
    8. {
    9. HWND hWnd = FindWindow(NULL, WindowName);
    10. if (hWnd != NULL)
    11. {
    12. DWORD ProcessId = 0;
    13. GetWindowThreadProcessId(hWnd, &ProcessId);
    14. return ProcessId;
    15. }
    16. return -1;
    17. }
    18. int main()
    19. {
    20. // 1. 使用函数创建线程快照,此时参数二没有意义,无论填写什么,遍历到的都是所有线程
    21. HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    22. // 2. 创建一个结构体用于保存遍历到的所有线程信息
    23. THREADENTRY32 ThreadInfo{ sizeof(THREADENTRY32) };
    24. // 3. 尝试从快照中获取到保存的第一个线程的信息
    25. if (Thread32First(Snapshot, &ThreadInfo))
    26. {
    27. DWORD Pid = FindProcessId(L"无标题 - 画图");
    28. do {
    29. // 4. 由于遍历到的是所有的线程,所以我们需要判断
    30. if (ThreadInfo.th32OwnerProcessID == Pid)
    31. {
    32. // 打开目标进程的每一个线程,尝试将这个线程挂起
    33. HANDLE Thread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ThreadInfo.th32ThreadID);
    34. if (Thread)
    35. {
    36. // SuspendThread(Thread);
    37. SuspendThread(Thread);
    38. ResumeThread(Thread);
    39. CloseHandle(Thread);
    40. }
    41. }
    42. } while (Thread32Next(Snapshot, &ThreadInfo));
    43. }
    44. return 0;
    45. }