由进程名获取进程ID及其主线程ID
2015-06-21 16:34
369 查看
1 说明
Windows环境此处进程名是指进程可执行文件的名称(任务管理器进程列表中显示的映像名称),如
notepad.exe。
Windows中没有直接可用的相关函数,实现思路为使用
CreateToolhelp32Snapshot函数创建进程或线程快照然后从中逐个比较。
需要包含头文件
#include <tlhelp32.h>
win7下测试
2 实现
获取进程ID// 由进程名获取进程ID(需要头文件tlhelp32.h) // 失败返回0 DWORD 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) // 失败返回0 DWORD 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函数实现略
本文原文链接 /article/10927866.html
相关文章推荐
- linux-常用命令-待续
- 平民软件的反思
- Android Studio开发第三篇版本管理Git
- 第十五周oj刷题——Problem F: C++习题 商品销售
- Google Java编程风格指南
- 基于VMware的网络配置
- jQuery检查某个元素在网页上是否存在
- 安装交叉编译工具出错,arm-linux-gcc: 没有那个文件或目录
- Python实现线程池代码分享
- 第一章:Spring Data JPA入门
- C++11 Tutorial: Introducing the Move Constructor and the Move Assignment Operator
- 剑指offer 面试题3
- 计划任务更新SVN
- Mysql视图
- Extern "C"的作用解析
- oracle中查询含字母的数据[正则表达式]
- Java IO 小结
- 图片缓存大小计算及清除(SDImage)
- 《博客园精华集》WebService篇(共79篇)
- [LeetCode][JavaScript]Add Two Numbers