由进程名获取进程ID及其主线程ID
来源:互联网 发布:全景地图制作软件 编辑:程序博客网 时间:2024/06/08 14:16
1 说明
Windows环境
- 此处进程名是指进程可执行文件的名称(任务管理器进程列表中显示的映像名称),如
notepad.exe
。 - Windows中没有直接可用的相关函数,实现思路为使用
CreateToolhelp32Snapshot
函数创建进程或线程快照然后从中逐个比较。 - 需要包含头文件
#include <tlhelp32.h>
- win7下测试
2 实现
获取进程ID
// 由进程名获取进程ID(需要头文件tlhelp32.h)// 失败返回0DWORD GetProcessIDFromName(LPCSTR szName){ DWORD id = 0; // 进程ID PROCESSENTRY32 pe; // 进程信息 pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 获取系统进程列表 if(Process32First(hSnapshot, &pe)) // 返回系统中第一个进程的信息 { do { if(0 == _stricmp(pe.szExeFile, szName)) // 不区分大小写比较 { id = pe.th32ProcessID; break; } }while(Process32Next(hSnapshot, &pe)); // 下一个进程 } CloseHandle(hSnapshot); // 删除快照 return id;}
获取主线程ID(先获取进程ID,再获取该进程的主线程ID)
// 由进程名获取主线程ID(需要头文件tlhelp32.h)// 失败返回0DWORD GetMainThreadIdFromName(LPCSTR szName){ DWORD idThread = 0; // 进程ID DWORD idProcess = 0; // 主线程ID // 获取进程ID PROCESSENTRY32 pe; // 进程信息 pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 获取系统进程列表 if(Process32First(hSnapshot, &pe)) // 返回系统中第一个进程的信息 { do { if(0 == _stricmp(pe.szExeFile, szName)) // 不区分大小写比较 { idProcess = pe.th32ProcessID; break; } }while(Process32Next(hSnapshot, &pe)); // 下一个进程 } CloseHandle(hSnapshot); // 删除快照 if (idProcess == 0) { return 0; } // 获取进程的主线程ID THREADENTRY32 te; // 线程信息 te.dwSize = sizeof(THREADENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); // 系统所有线程快照 if(Thread32First(hSnapshot, &te)) // 第一个线程 { do { if(idProcess == te.th32OwnerProcessID) // 认为找到的第一个该进程的线程为主线程 { idThread = te.th32ThreadID; break; } }while(Thread32Next(hSnapshot, &te)); // 下一个线程 } CloseHandle(hSnapshot); // 删除快照 return idThread;}
3 示例
例子是通过向进程的主线程发送WM_QUIT消息结束主线程消息循环使进程退出,这样相比TerminateProcess
有一个优点:如果被关闭的进程是在主线程消息循环之后进行清理工作的话,就保证了该进程退出前能完成清理。(注意,此方法并不能保证关闭任意进程,如没有线程消息循环的普通控制台程序)
#include <stdio.h>#include <windows.h>#include <tlhelp32.h>DWORD GetMainThreadIdFromName(LPCSTR szName);int main(void){ DWORD id = GetMainThreadIdFromName("notepad.exe"); if (id > 0) { PostThreadMessage(id, WM_QUIT, 0, 0); } printf("id = %d\n", id); system("pause"); return 0;}// GetMainThreadIdFromName函数实现略
本文原文链接 http://blog.csdn.net/yanglx2022/article/details/46582629
0 0
- 由进程名获取进程ID及其主线程ID
- 利用进程ID获取主线程ID
- 由进程名获取进程ID的方法及实现
- 根据进程ID获取其主线程ID
- 由进程名字获取进程 ID
- 如何通过进程ID获取进程名
- 通过进程名获取进程ID
- linux通过进程名获取进程id
- 通过进程ID获取进程名
- 通过进程名获取进程ID
- 根据进程名获取进程id
- 通过进程名获取进程id
- 进程1:由进程ID获取进程名字
- VC由进程ID获取窗口句柄
- VC++ 通过进程名或进程ID获取进程句柄
- solaris获取进程id,进程名, 进程状态总结
- 根据进程名获取进程id,并杀进程
- VC++ 通过进程名或进程ID获取进程句柄
- 基于VMware的网络配置
- 第十五周oj刷题——Problem F: C++习题 商品销售
- Java Card Applet Development——环境搭建及基础概念
- java中String.intern() 方法到底是干啥的?
- linux-常用命令-待续
- 由进程名获取进程ID及其主线程ID
- Java卡环境介绍
- Contest2079 - 湖南多校对抗赛(2015.05.03) Problem A: Twenty-four point
- JFrame重绘去掉默认的标题图标等
- 【LDA】用MPI优化GibbsLDA++-0.2
- Java Card CAP 文件组件分析
- TCP/IP协议族-----7、网际协议版本4(IPv4)
- POJ 2289(多重匹配+二分)
- Leetcode38: Rectangle Area