#include <iostream>
#include <windows.h>
#include <TlHelp32.h>
// 在线程内核对象对应的结构体中,有一个挂起计数,只有当挂起计数为 0 的时候,线程才会被调度(执行),
// 可以使用 ResumeThread 让挂起计数 -1,使用 Susepend 函数让挂起计数 +1。
// 查找指定窗口对应的进程id
DWORD FindProcessId(LPCWSTR WindowName)
{
HWND hWnd = FindWindow(NULL, WindowName);
if (hWnd != NULL)
{
DWORD ProcessId = 0;
GetWindowThreadProcessId(hWnd, &ProcessId);
return ProcessId;
}
return -1;
}
int main()
{
// 1. 使用函数创建线程快照,此时参数二没有意义,无论填写什么,遍历到的都是所有线程
HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
// 2. 创建一个结构体用于保存遍历到的所有线程信息
THREADENTRY32 ThreadInfo{ sizeof(THREADENTRY32) };
// 3. 尝试从快照中获取到保存的第一个线程的信息
if (Thread32First(Snapshot, &ThreadInfo))
{
DWORD Pid = FindProcessId(L"无标题 - 画图");
do {
// 4. 由于遍历到的是所有的线程,所以我们需要判断
if (ThreadInfo.th32OwnerProcessID == Pid)
{
// 打开目标进程的每一个线程,尝试将这个线程挂起
HANDLE Thread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ThreadInfo.th32ThreadID);
if (Thread)
{
// SuspendThread(Thread);
SuspendThread(Thread);
ResumeThread(Thread);
CloseHandle(Thread);
}
}
} while (Thread32Next(Snapshot, &ThreadInfo));
}
return 0;
}