一、进程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# 获得当前 进程 或 线程的ID,comsky。

由进程名获取进程ID及其主线程ID,yanglx2022。

线程、线程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. Shell脚本实现非法IP登陆自动报警【转】

    服务器的安全稳定是每个运维都希望达到的目标,毕竟网站一旦流量大了,访问高了,就会有一些无聊人来攻击,帮忙检测漏洞是好,但纯ddos的性质就很恶劣了.说远了,这篇文章只是检测有非法ip登录到服务器上就自 ...

  2. 移动端HTML5开发 选择方案

    如今出现了大量的CSS前端框架,但真正优秀的框架只有少数几个. 本文将会比较其中五个最佳的框架.每个框架都有自己的优点和缺点,以及具体的应用领域,你可以根据自己的具体项目需求进行选择.此外,许多选项都 ...

  3. 数组slice方法

    slice slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素.(不会改变原数组) start参数:必须,规定从何处 ...

  4. Ubuntu下mysql使用

    1. 从网上安装 sudo apt-get install mysql-server.装完已经自动配置好环境变量,可以直接使用mysql的命令. 注:建议将/etc/apt/source.list中的 ...

  5. C语言:用指针求最大值和最小值

    用指针求数组最大值和最小值(10分) 题目内容: 用指针求含有十个元素的数组最大值和最小值 主函数参考 int main() { int a[10],i,maxnum,minnum; for(i=0; ...

  6. 【AtCoder】ARC090

    C - Candies 前一枚举一个i,求第一行的前i个和第二行从第n个到第i个 代码 #include <bits/stdc++.h> #define fi first #define ...

  7. ps -aux与ps -ef

    ps -aux与ps -ef这两个命令显示的结果是差不多的. 不同之处就是显示风格不同,前者是BSD风格,后者SYSTEM V(其实我不太明白这尼玛风格是什么跟什么,我看起来都差不多啊) 然后重要的不 ...

  8. 009.KVM配置调整

    一 内存CPU调整 1.1 增大虚拟机内存 [root@kvm-host ~]# virsh shutdown vm01-centos6.8 [root@kvm-host ~]# virsh edit ...

  9. 使用Golang开发一个本地代理

    引言 最近需要对接一个接口,人家提供了两种调用方式,第一种是基于IE浏览器的Active,第二种是动态链接库dll.我们公司的产品不支持IE,所以只能通过调用dll来完成了. 之前我已经用Java实现 ...

  10. ubuntu18.04初始化配置

    目录 ubuntu18.04初始化配置 ifconfig sshd smb other vim 配置 最后 ubuntu18.04初始化配置 虚拟机挂了, 又得重新安装配置一遍, 这里记录了我几乎每次 ...