一、进程ID获取

1.1  当前进程的Id

方法1 通过进程名获取

下面的例子中,也包含了获取该进程下的线程的方法。

System.Diagnostics.Process[] processes;bool foundProcess = false;
System.Diagnostics.ProcessThreadCollection threads = null;
System.Threading.Thread thread = null; processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in processes)
{
  if (p.ProcessName == "进程名")
  {
    threads = p.Threads;
    foundProcess = true;
    break;
  }
}
if (foundProcess)
{
  foreach (System.Threading.Thread th in threads)
  {
    if (th.Name == "xxxxx")
    {
      thread = th;
      break;
    }
  }
} if (thread != null)
{
  // 不知道threadId是不是你说的线程ID.
  int threadId = thread.ManagedThreadId;
}

方法2 直接获取

Process processes = Process.GetCurrentProcess
processes.id // 获得当前进程的ID

二、线程ID获取

2.1 C#获取当前线程ID

方法1 推荐

Thread.CurrentThread.ManagedThreadId

方法2

AppDomain.GetCurrentThreadId()

其它

GetThreadId 根据线程句柄得到线程ID;
GetWindowThreadProcessId ,根据窗口句柄得到此窗口所在线程的ID(也同时得到进程的ID);
OpenThread,能根据ID得到线程的句柄;

获取在关联进程中运行的一组线程:Process.Threads 属性
获取线程的唯一标识符:ProcessThread.Id

2.2 C++获取主线程

此处进程名是指进程可执行文件的名称(任务管理器进程列表中显示的映像名称),如notepad.exe。Windows中没有直接可用的相关函数,实现思路为使用CreateToolhelp32Snapshot函数创建进程或线程快照然后从中逐个比较。需要包含头文件#include <tlhelp32.h>。

获取进程ID

// 由进程名获取进程ID(需要头文件tlhelp32.h)
// 失败返回0
DWORD GetProcessIDFromName(LPCSTR szName)
{
DWORD id = ; // 进程ID
PROCESSENTRY32 pe; // 进程信息
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); // 获取系统进程列表
if(Process32First(hSnapshot, &pe)) // 返回系统中第一个进程的信息
{
do
{
if( == _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 = ; // 进程ID
DWORD idProcess = ; // 主线程ID // 获取进程ID
PROCESSENTRY32 pe; // 进程信息
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); // 获取系统进程列表
if(Process32First(hSnapshot, &pe)) // 返回系统中第一个进程的信息
{
do
{
if( == _stricmp(pe.szExeFile, szName)) // 不区分大小写比较
{
idProcess = pe.th32ProcessID;
break;
}
}while(Process32Next(hSnapshot, &pe)); // 下一个进程
}
CloseHandle(hSnapshot); // 删除快照
if (idProcess == )
{
return ;
} // 获取进程的主线程ID
THREADENTRY32 te; // 线程信息
te.dwSize = sizeof(THREADENTRY32);
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ); // 系统所有线程快照
if(Thread32First(hSnapshot, &te)) // 第一个线程
{
do
{
if(idProcess == te.th32OwnerProcessID) // 认为找到的第一个该进程的线程为主线程
{
idThread = te.th32ThreadID;
break;
}
}while(Thread32Next(hSnapshot, &te)); // 下一个线程
}
CloseHandle(hSnapshot); // 删除快照
return idThread;
}

使用:

例子是通过向进程的主线程发送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 > )
{
PostThreadMessage(id, WM_QUIT, , );
}
printf("id = %d\n", id);
system("pause");
return ;
} // GetMainThreadIdFromName函数实现略

参考文章

C# 获得当前 进程 或 线程的IDcomsky

由进程名获取进程ID及其主线程IDyanglx2022

线程、线程ID获取的更多相关文章

  1. 利用进程ID获取主线程ID

    利用进程ID获取主线程ID,仅适用于单线程.多线程应区分哪个是主线程,区分方法待验证 (1)好像可以用StartTime最早的,不过通过线程执行时间不一定可靠,要是在最开始就CreateThread了 ...

  2. Java如何获取正在运行的线程的Id?

    在Java编程中,如何获取正在运行的线程的Id? 以下示例演示如何使用getThreadId()方法获取正在运行的线程的Id. package com.yiibai; public class IdT ...

  3. JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

    JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...

  4. java线程状态和获取线程基本信息

    1. 线程状态 新生状态 用 new 关键字建立一个线程后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start()方法进入就绪状态. 就绪状态 处于就绪状态线程具备了运行 ...

  5. C# 获得当前 进程 或 线程的ID

    如果获得当前进程的Id用: Process[] processes = Process.GetProcesses(); foreach(Process process in processes) {  ...

  6. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  7. https://github.com/python/cpython/blob/master/Doc/library/contextlib.rst 被同一个线程多次获取的同步基元组件

    # -*- coding: utf-8 -*- import time from threading import Lock, RLock from datetime import datetime ...

  8. Java多线程和并发(四),线程返回值获取方式和Callable接口

    目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Cal ...

  9. 线程&线程控制

    线程基本概念: 1 线程 (1)概念:linux下没有真正的线程,所谓的线程都是通过进程的pcb模拟的,因此linux下的线程也称为“轻量级进程”,之前我们所说的进程现在看来,可以理解为:只有一个线程 ...

随机推荐

  1. stylus项目知识点

    1.在项目中,引入.sty文件的时候,用来下面方式 @import "~common/stylus/variable.styl" ~ 是stylus的写法,参考https://gi ...

  2. Java封装概述

    1.封装概述 private  public 2.实现封装 例子: package com.java1995; public class Student { private String name; ...

  3. MAC下调试JSON接口的工具(HTTP抓包工具)

    MAC下的HTTP接口抓包工具,专业级: 专门做JSON接口测试的工具,简单好用!

  4. 从 prototype.js 深入学习 javascript 的面向对象特性

    从 prototype.js 深入学习 javascript 的面向对象特性 js是一门很强大的语言,灵活,方便. 目前我接触到的语言当中,从语法角度上讲,只有 Ruby 比它更爽. 不过我接触的动态 ...

  5. P(查准率),R(查全率),F1 值

    起源: 我们平时用的精度 accuracy,也就是整体的正确率 acc=predict_right_num/predict_num 这个虽然常用,但不能满足所有任务的需求.比如,因为香蕉太多了,也不能 ...

  6. 前端架构之路:Windows下安装Nodejs步骤

      最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要差.二是使用过Angular.js,感觉对开发人员要求较 ...

  7. 【AtCoder】AGC020

    A - Move and Win 题解 看两个人相遇的时候谁先手即可,相遇之后第一个移动的人必输 代码 #include <bits/stdc++.h> #define fi first ...

  8. ubuntu18.04 安装mysql不出现设置 root 帐户的密码问题(装)

    ubuntu18.04 安装mysql不出现设置 root 帐户的密码问题      https://blog.csdn.net/NeptuneClouds/article/details/80995 ...

  9. tqdm:Python 进度条

    Tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息.用户只需要封装任意的迭代器,是一个快速.扩展性强的进度条工具库. 用法:tqdm(iterator) 代码地址 ...

  10. Ajax json交互和SpringMVC中@RequestBody

    Ajax json交互和SpringMVC中@RequestBody 标签: 背景 自己提供出去得接口中参数设置为@RequestBody VipPromotionLog vipPromotionLo ...