C++ 根据程序名获取此程序线程ID的代码
时间: 2024-03-10 20:45:18 浏览: 125
进程名获取PID的软件源码
5星 · 资源好评率100%
可以使用Windows API中的 `CreateToolhelp32Snapshot` 和 `Thread32First` 函数来根据程序名获取程序线程ID。以下是一个简单的示例代码:
```c++
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <string>
DWORD GetProcessThreadID(const std::wstring& procName)
{
HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
THREADENTRY32 te32;
// 获取系统中所有线程的快照
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
return 0;
// 设置结构体大小,必须初始化dwSize
te32.dwSize = sizeof(THREADENTRY32);
// 获取第一个线程的信息
if (!Thread32First(hThreadSnap, &te32))
{
CloseHandle(hThreadSnap);
return 0;
}
// 遍历所有线程,找出指定进程的线程ID
do
{
// 获取线程所属进程的句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, te32.th32OwnerProcessID);
if (hProcess)
{
// 获取进程的可执行文件路径
wchar_t path[MAX_PATH];
if (GetModuleFileNameEx(hProcess, NULL, path, MAX_PATH))
{
// 比较可执行文件路径和指定的程序名是否一致
std::wstring exeName = path;
std::size_t pos = exeName.find_last_of('\\');
if (pos != std::wstring::npos)
exeName = exeName.substr(pos + 1);
if (exeName == procName)
{
CloseHandle(hProcess);
CloseHandle(hThreadSnap);
return te32.th32ThreadID;
}
}
CloseHandle(hProcess);
}
} while (Thread32Next(hThreadSnap, &te32));
CloseHandle(hThreadSnap);
return 0;
}
int main()
{
std::wstring procName = L"notepad.exe"; // 指定程序名
DWORD tid = GetProcessThreadID(procName);
std::cout << "Thread ID of process " << procName << ": " << tid << std::endl;
return 0;
}
```
其中 `procName` 参数为指定程序的名称,函数会返回该程序的一个线程ID。如果找不到指定程序的线程,函数返回0。需要注意的是,这个线程ID只是该程序的一个线程ID,如果该程序有多个线程,需要使用其他方法来获取。
阅读全文