C# 如何获取当前进程名

C# 如何获取当前进程名,第1张

Process p = ProcessGetProcessById(id)

设p为指定id的进程

那么,Process类有 属性

MainWindowHandle 获取关联进程主窗口的窗口句柄。

MainWindowTitle 获取进程的主窗口标题。

也就是

pMainWindowHandle

pMainWindowTitle

到于主程序类名,不好意思,windows可执行程序不一定是用C#写的哦,所以“不存在”主程序类名这种东西。

#include <tlhelp32h>

int GetProcessThreadList(DWORD th32ProcessID) //进程的ID

{

HANDLE hThreadSnap;

THREADENTRY32 th32;

hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, th32ProcessID);

if (hThreadSnap == INVALID_HANDLE_VALUE)

{

return 1;

}

th32dwSize = sizeof(THREADENTRY32);

if (!Thread32First(hThreadSnap, &th32))

{

CloseHandle(hThreadSnap);

return 1;

}

do

{

if (th32th32OwnerProcessID == th32ProcessID)

{

printf("ThreadID: %ld\n", th32th32ThreadID); //显示找到的线程的ID

}

}while(Thread32Next(hThreadSnap, &th32));

CloseHandle(hThreadSnap);

return 0;

}

如何查看程序占用的端口

一、

查看所有进程占用的端口

在开始-运行-cmd,输入:netstat

–ano可以查看所有进程

二、查看占用指定端口的程序

当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令

netstat

–ano|findstr

“指定端口号”

二、查看占用指定端口的程序

当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令

netstat

–ano|findstr

“指定端口号”

二、查看占用指定端口的程序

当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令

netstat

–ano|findstr

“指定端口号”

如:查询占用了8080端口的进程:netstat

-ano|findstr

"8080"

三、通过任务管理器杀死相关的进程

方法一:使用任务管理器杀死进程

打开任务管理器->查看->选择列->然后勾选PID选项,回到任务管理器上可以查看到对应的pid,然后结束进程

当然上面的方法有时候不好用,就是任务管理器中的进程比较多的时候,然后去找到对应的进程是很麻烦的,所以还有一种方法可以杀死进程的

方法二:使用命令杀死进程

1>首先找到进程号对应的进程名称

tasklist|findstr

进程号

如:tasklist|findstr

3112

2>然后根据进程名称杀死进程

taskkill

/f

/t

/im

进程名称

如:taskkill

/f

/t

/im

/javawexe

#include

#include

#include

#include

#pragma once

#pragma message("Psapih --> Linking with Psapilib")

#pragma comment(lib,"Psapilib")

int main(){

DWORD proId[500];

DWORD pProId = proId;

DWORD totlaNum = 1000;

DWORD num = 4;

BOOL ret = EnumProcesses(pProId, totlaNum, &num);

for (int i = 0; i < 500; i++) {

printf("%d ", proId[i]);

}

}

}

#获取了系统所有进程ID之后,就可以遍历ID,对进程进行相关处理了。比如杀死进程,退出等

首先是获取特定进程对象,可以使用ProcessGetProcesses()方法来获取系统中运行的所有进程,或者使用ProcessGetCurrentProcess()方法来获取当前程序所对应的进程对象。当有了进程对象后,可以通过进程对象名称来创建PerformanceCounter类型对象,通过设定PerformanceCounter构造函数的参数实现获取特定进程的CPU和内存使用情况。

具体实例代码如下:

首先是获取本机中所有进程对象,分别输出某一时刻各个进程的内存使用情况:

using System;using SystemCollectionsGeneric;using SystemLinq;using SystemText;using SystemDiagnostics;using SystemThreading;namespace CSharpPerformance{//该程序可以实时监控所有进程或者指定进程的工作集、私有工作集 class Program { static void Main(string[] args) { //新建一个Stopwatch变量用来统计程序运行时间 Stopwatch watch = StopwatchStartNew(); //获取本机运行的所有进程ID和进程名,并输出哥进程所使用的工作集和私有工作集 foreach (Process ps in ProcessGetProcesses()) { PerformanceCounter pf1 = new PerformanceCounter("Process", "Working Set - Private", psProcessName); PerformanceCounter pf2 = new PerformanceCounter("Process", "Working Set", psProcessName); ConsoleWriteLine("{0}:{1} {2:N}KB", psProcessName, "工作集(进程类)", psWorkingSet64 / 1024); ConsoleWriteLine("{0}:{1} {2:N}KB", psProcessName, "工作集 ", pf2NextValue() / 1024); //私有工作集 ConsoleWriteLine("{0}:{1} {2:N}KB", psProcessName, "私有工作集 ", pf1NextValue() / 1024); } watchStop(); ConsoleWriteLine(watchElapsed); ConsoleReadLine(); } }}

其中,工作集psWorkingSet64是静态的,pf2NextValue()是动态变化的,工作集包含进程运行时其独占的内存和与其他进程共享的内存的和,而私有工作集是只包含进程独占的内存。

下面一组代码可以动态显示本程序所对应的进程的CPU和内存使用率的变化:

首先是SystemInfocs类:

using System;using SystemCollectionsGeneric;using SystemDiagnostics;using SystemThreading;using SystemIO;using SystemText;using SystemManagement;using SystemRuntimeInteropServices;namespace CSharpPerformance{ public class SystemInfo { private int m_ProcessorCount = 0; //CPU个数 private PerformanceCounter pcCpuLoad; //CPU计数器 private long m_PhysicalMemory = 0; //物理内存 private const int GW_HWNDFIRST = 0; private const int GW_HWNDNEXT = 2; private const int GWL_STYLE = (-16); private const int WS_VISIBLE = 268435456; private const int WS_BORDER = 8388608; #region AIP声明 [DllImport("IpHlpApidll")] extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder); [DllImport("User32")] private extern static int GetWindow(int hWnd, int wCmd); [DllImport("User32")] private extern static int GetWindowLongA(int hWnd, int wIndx); [DllImport("user32dll")] private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize); [DllImport("user32", CharSet = CharSetAuto)] private extern static int GetWindowTextLength(IntPtr hWnd); #endregion #region 构造函数 ///

/// 构造函数,初始化计数器等 ///

public SystemInfo() { //初始化CPU计数器 pcCpuLoad = new PerformanceCounter("Processor", "% Processor Time", "_Total"); pcCpuLoadMachineName = ""; pcCpuLoadNextValue(); //CPU个数 m_ProcessorCount = EnvironmentProcessorCount; //获得物理内存 ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mcGetInstances(); foreach (ManagementObject mo in moc) { if (mo["TotalPhysicalMemory"] != null) { m_PhysicalMemory = longParse(mo["TotalPhysicalMemory"]ToString()); } } } #endregion #region CPU个数 ///

/// 获取CPU个数 ///

public int ProcessorCount { get { return m_ProcessorCount; } } #endregion #region CPU占用率 ///

/// 获取CPU占用率 ///

public float CpuLoad { get { return pcCpuLoadNextValue(); } } #endregion #region 可用内存 ///

/// 获取可用内存 ///

public long MemoryAvailable { get { long availablebytes = 0; //ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT FROM Win32_PerfRawData_PerfOS_Memory"); //foreach (ManagementObject mo in mosGet()) //{ // availablebytes = longParse(mo["Availablebytes"]ToString()); //} ManagementClass mos = new ManagementClass("Win32_OperatingSystem"); foreach (ManagementObject mo in mosGetInstances()) { if (mo["FreePhysicalMemory"] != null) { availablebytes = 1024 longParse(mo["FreePhysicalMemory"]ToString()); } } return availablebytes; } } #endregion #region 物理内存 ///

/// 获取物理内存 ///

public long PhysicalMemory { get { return m_PhysicalMemory; } } #endregion #region 结束指定进程 ///

/// 结束指定进程 ///

///

进程的 Process IDpublic static void EndProcess(int pid) { try { Process process = ProcessGetProcessById(pid); processKill(); } catch { } } #endregion #region 查找所有应用程序标题 ///

/// 查找所有应用程序标题 ///

///

应用程序标题范型

public static List

FindAllApps(int Handle) { ListApps = new List(); int hwCurr; hwCurr = GetWindow(Handle, GW_HWNDFIRST); while (hwCurr > 0) { int IsTask = (WS_VISIBLE | WS_BORDER); int lngStyle = GetWindowLongA(hwCurr, GWL_STYLE); bool TaskWindow = ((lngStyle & IsTask) == IsTask); if (TaskWindow) { int length = GetWindowTextLength(new IntPtr(hwCurr)); StringBuilder sb = new StringBuilder(2 length + 1); GetWindowText(hwCurr, sb, sbCapacity); string strTitle = sbToString(); if (!stringIsNullOrEmpty(strTitle)) { AppsAdd(strTitle); } } hwCurr = GetWindow(hwCurr, GW_HWNDNEXT); } return Apps; } #endregion }}

然后是执行代码:

using System;using SystemCollectionsGeneric;using SystemLinq;using SystemText;using SystemDiagnostics;using SystemThreading;namespace CSharpPerformance{//该程序可以实时监控程序本身对应进程的工作集、私有工作集和CPU使用率 class Program { static void Main(string[] args) { //获取当前进程对象 Process cur = ProcessGetCurrentProcess(); PerformanceCounter curpcp = new PerformanceCounter("Process", "Working Set - Private", curProcessName); PerformanceCounter curpc = new PerformanceCounter("Process", "Working Set", curProcessName); PerformanceCounter curtime = new PerformanceCounter("Process", "% Processor Time", curProcessName); //上次记录CPU的时间 TimeSpan prevCpuTime = TimeSpanZero; //Sleep的时间间隔 int interval = 1000; PerformanceCounter totalcpu = new PerformanceCounter("Processor", "% Processor Time", "_Total"); SystemInfo sys = new SystemInfo(); const int KB_DIV = 1024; const int MB_DIV = 1024 1024; const int GB_DIV = 1024 1024 1024; while (true) { //第一种方法计算CPU使用率 //当前时间 TimeSpan curCpuTime = curTotalProcessorTime; //计算 double value = (curCpuTime - prevCpuTime)TotalMilliseconds / interval / EnvironmentProcessorCount 100; prevCpuTime = curCpuTime; ConsoleWriteLine("{0}:{1} {2:N}KB CPU使用率:{3}", curProcessName, "工作集(进程类)", curWorkingSet64 / 1024,value);//这个工作集只是在一开始初始化,后期不变 ConsoleWriteLine("{0}:{1} {2:N}KB CPU使用率:{3}", curProcessName, "工作集 ", curpcNextValue() / 1024,value);//这个工作集是动态更新的 //第二种计算CPU使用率的方法 ConsoleWriteLine("{0}:{1} {2:N}KB CPU使用率:{3}%", curProcessName, "私有工作集 ", curpcpNextValue() / 1024,curtimeNextValue()/EnvironmentProcessorCount); //ThreadSleep(interval); //第一种方法获取系统CPU使用情况 ConsoleWrite("r系统CPU使用率:{0}%", totalcpuNextValue()); //ThreadSleep(interval); //第二章方法获取系统CPU和内存使用情况 ConsoleWrite("r系统CPU使用率:{0}%,系统内存使用大小:{1}MB({2}GB)", sysCpuLoad, (sysPhysicalMemory - sysMemoryAvailable) / MB_DIV, (sysPhysicalMemory - sysMemoryAvailable) / (double)GB_DIV); ThreadSleep(interval); } ConsoleReadLine(); } }}

以上程序可以正常运行,没隔1S刷新一次,实现动态显示本程序对应进程的CPU和内存使用情况。

最基本的系统进程(也就是说,这些进程是系统运行的基本条件,有了这些进程,系统就能正常运行)

smssexe Session Manager

csrssexe 子系统服务器进程

winlogonexe 管理用户登录

servicesexe 包含很多系统服务

lsassexe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。

(系统服务)

产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务)

svchostexe 包含很多系统服务

svchostexe

SPOOLSVEXE 将文件加载到内存中以便迟后打印。(系统服务)

explorerexe 资源管理器

internatexe 托盘区的拼音图标

附加的系统进程(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少)

mstaskexe 允许程序在指定时间运行。(系统服务)

regsvcexe 允许远程注册表 *** 作。(系统服务)

winmgmtexe 提供系统管理信息(系统服务)。

inetinfoexe 通过 Internet 信息服务的管理单元提供 FTP 连接和管理。(系统服务)

tlntsvrexe 允许远程用户登录到系统并且使用命令行运行控制台程序。(系统服务)

允许通过 Internet 信息服务的管理单元管理 Web 和 FTP 服务。(系统服务)

tftpdexe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务)

termsrvexe 提供多会话环境允许客户端设备访问虚拟的 Windows 2000 Professional 桌面会话以及运行在服务器上的基于 Windows 的程序。(系统服务)

dnsexe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)

Windows XP装上Sp 2 后进程添加的新丁

controlexe 是控制面板程序。

algexe --- Application Layer Gateway Service 应用层网关服务(防火墙)

wscenfyexe --- Windows Security Center Notification App 安全中心警告程序

Wuaucltexe --- Automatic Updates 自动升级

wdfmgr or wdfmgrexe进程 --- Windows Driver Foundation Manager 一般进程,Microsoft Windows media player 10 的一部分。

CDANTSRVEXE --- 安装了AUTOCAD、3DSMAX等就会有

参考资料:

>

如果是多个窗口,那应该每个窗口是一个进程,你通过FINDWINDOW可以找到对应的进程, *** 作就可以了。如果是浏览器,每个tab应该是子窗体,用FINDWINDOWEX函数来找就行了。

以上就是关于C# 如何获取当前进程名全部的内容,包括:C# 如何获取当前进程名、如何用WindowsAPI取得一个进程的所有线程句柄、Window通过cmd查看端口占用、相应进程、杀死进程等的命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9786518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存