易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册账号
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 1074|回复: 1

C++ 遍历指定进程的线程列表,在 VS2015 测试通过,已添加中文注释。

[复制链接]
发表于 2016-7-29 11:00:59 | 显示全部楼层 |阅读模式
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

//  提前声明:
BOOL ListProcessThreads(DWORD dwOwnerPID);
void printError(TCHAR* msg);

int main(void) {
        ListProcessThreads(GetCurrentProcessId());  // 可使用任务管理器获取某进程的 PID,然后替换 GetCurrentProcessId()
        return 0;
}

BOOL ListProcessThreads(DWORD dwOwnerPID) {
        HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
        THREADENTRY32 te32;

        // 把所有进程拍一个快照
        hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if (hThreadSnap == INVALID_HANDLE_VALUE)
                return(FALSE);

        // 在使用 Thread32First 前初始化 THREADENTRY32 的结构大小.
        te32.dwSize = sizeof(THREADENTRY32);

        // 获取第一个线程信息, 如果失败则退出.
        if (!Thread32First(hThreadSnap, &te32)) {
                printError(TEXT("Thread32First"));  // 打印显示错误 [这里可用 GetLastError() 查看具体错误原因]
                CloseHandle(hThreadSnap);     // 必须在使用后清除快照对象!
                return(FALSE);
        }

        // 现在获取系统线程列表, 并显示与指定进程相关的每个线程的信息
        do {
                if (te32.th32OwnerProcessID == dwOwnerPID) {
                        _tprintf(TEXT("\n     THREAD ID      = 0x%08X"), te32.th32ThreadID);
                        _tprintf(TEXT("\n     base priority  = %d"), te32.tpBasePri);
                        _tprintf(TEXT("\n     delta priority = %d"), te32.tpDeltaPri);
                }
        } while (Thread32Next(hThreadSnap, &te32));

        _tprintf(TEXT("\n"));

        //  千万不要忘记清除快照对象!
        CloseHandle(hThreadSnap);
        return(TRUE);
}

void printError(TCHAR* msg) {
        DWORD eNum;
        TCHAR sysMsg[256];
        TCHAR* p;

        eNum = GetLastError();
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, eNum,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认语言
                sysMsg, 256, NULL);  // 行末结尾使用 NULL .
        p = sysMsg;
        while ((*p > 31) || (*p == 9))
                ++p;
        do { *p-- = 0; } while ((p >= sysMsg) &&
                ((*p == '.') || (*p < 33)));

        // 打印消息
        _tprintf(TEXT("\n  WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg);
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2019-8-19 15:35

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表